Salut, je veux changer le 'p' par un 'b' dans la chaine
char *mot="taple";
alors j'ai fais *(mot+2)='b' mais ça ne marche pas Vous auriez une ? merci bp, Calaz
Salut, je veux changer le 'p' par un 'b' dans la chaine
char *mot="taple";
alors j'ai fais *(mot+2)='b' mais ça ne marche pas Vous auriez une ? merci bp, Calaz
Ca ne marche pas tout simplement parce que tu segfault.
C'est soit
soit
Code : Sélectionner tout - Visualiser dans une fenêtre à part char mot[]="taple";
(ne pas oublier le free qui va bien)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 char *mot = malloc(6*sizeof(char)); sprintf(mot,"taple");
mais pas
Tu n'a pas alloué de taille pour stocker tes caractères.
Code : Sélectionner tout - Visualiser dans une fenêtre à part char *mot="taple";
Bref et au lieu de
il y a plus simple
Code : Sélectionner tout - Visualiser dans une fenêtre à part *(mot+2)='b'
Code : Sélectionner tout - Visualiser dans une fenêtre à part mot[2]='b'
Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
Mon espace perso[/B]
La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]
Gni ? Quel est le sens de cette pensée profonde ?Envoyé par Skyrunner
Pas de Wi-Fi à la maison : CPL
Exact, on ne parle pas ici d'alllouer quoi que ce soit mais de modifier une chaîne existante.
Par contre, il est possible en effet qu'il y ait une segfault, car la chaîne est peut-être placée dans une section en lecture seule. Mais là, un bon compilateur aurait forcé les constantes chaînes en const si elles sont dans une section read-only...
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Le compilateur ne va pas modifier le code source... Par contre, et selon ses reglages, il peut detecter qu'un pointeur de type char est initialisé avec l'adresse d'une chaine read-only et signaler l'incohérence.Envoyé par Médinoc
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 #line 1 #include <stdio.h> int main (void) { char const *sa = "Hello world"; char *sb = "Bye"; return 0; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 ../main.c: In function `main_': ../main.c:6: warning: initialization discards qualifiers from pointer target type ../main.c:5: warning: unused variable `sa' ../main.c:6: warning: unused variable `sb'
Pas de Wi-Fi à la maison : CPL
avec DevC++, le 2nd programme fonctionne alors que le 1er se plante à l'exécution,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 #include <stdio.h> int main (void) { char *toto = "titi"; toto[1]='a'; printf (toto); getchar(); return 0; }c'est vrai que cela dépend du compilateur. J'aurais préféré que ce
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 #include <stdio.h> int main (void) { char toto[]= "titi"; toto[1]='a'; printf (toto); getchar(); return 0; }
dernier, soit provoque une erreur de compile (et non le WARNING indiqué
par Emmanuel), soit range la donnée dans une mémoire "write"
Reprenons ;Envoyé par HRS
provoque
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 #line 1 #include <stdio.h> int main (void) { char *toto = "titi"; toto[1] = 'a'; return 0; }
On met alors son neurone en route et essaye naïvement de corriger comme ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 ../main.c: In function `main_': ../main.c:4: warning: initialization discards qualifiers from pointer target type
et là, on voit bien qu'on a fait une anerie...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 #line 1 #include <stdio.h> int main (void) { char const *toto = "titi"; toto[1] = 'a'; return 0; }
La bonne correction étant évidemment
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 ../main.c: In function `main_': ../main.c:5: error: assignment of read-only location
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 #include <stdio.h> int main (void) { char toto[] = "titi"; toto[1] = 'a'; return 0; }
Pas de Wi-Fi à la maison : CPL
Il me semble hélas qu'il faut un flag pour déclarer les constantes chaînes en const (au lieu de le faire automatiquement)...
Si c'est bien le cas, Emmanuel, tu peux poster tes options de compil?
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Envoyé par MédinocVersion 'basique'
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 C:\DEV-CPP\BIN>gcc --version GCC.EXE (GCC) 3.4.2 (mingw-special) Copyright (C) 2004 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Version 'stricte'
Code : Sélectionner tout - Visualiser dans une fenêtre à part -O2 -Wextra -Wall
Version 'affinée'
Code : Sélectionner tout - Visualiser dans une fenêtre à part -O2 -Wextra -Wall -ansi -pedantic
A tout ça, on peut ajouter
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 -O2 -Wchar-subscripts -Wcomment -Wformat=2 -Wimplicit-int -Werror-implicit-function-declaration -Wmain -Wparentheses -Wsequence-point -Wreturn-type -Wswitch -Wtrigraphs -Wunused -Wuninitialized -Wunknown-pragmas -Wfloat-equal -Wundef -Wshadow -Wpointer-arith -Wbad-function-cast -Wwrite-strings -Wconversion -Wsign-compare -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wmissing-noreturn -Wformat -Wmissing-format-attribute -Wno-deprecated-declarations -Wpacked -Wredundant-decls -Wnested-externs -Winline -Wlong-longmais il va falloir modifier les includes de gcc... Je ne m'y risquerais pas...
Code : Sélectionner tout - Visualiser dans une fenêtre à part -Werror
Pas de Wi-Fi à la maison : CPL
Medinoc :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 char *mot="taple"; alors j'ai fais *(mot+2)='b'. Hélas, certains compilateurs laissent passer et, à l'exécution, on n'a pas forcément d'erreur (apparente). Meme dans ce dernier cas, le programme doit être considéré comme devenu instable et d'un comportement imprévisible.Par contre, il est possible en effet qu'il y ait une segfault...
Ce code est donc à exclure.
Publication : Concepts en C
Mon avatar : Glenn Gould
--------------------------------------------------------------------------
Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
Bonjour,
Pas forcement :Envoyé par Skyrunner
http://nicolasj.developpez.com/articles/erreurs/#LIX
http://c.developpez.com/faq/c/?page=...GS_string_init
C'est un problème lié à Mingw je croi (utilisation du mot clés inline pour la fonction printf qui est une nouveauté du C99), avec cygwin ou sous Linux il n'y a pas de problème.Envoyé par Emmanuel Delahaye
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager