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 :idea: ? merci bp, Calaz
Version imprimable
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 :idea: ? merci bp, Calaz
Ca ne marche pas tout simplement parce que tu segfault.
C'est soit
soitCode:char mot[]="taple";
(ne pas oublier le free qui va bien)Code:
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:char *mot="taple";
Bref et au lieu de
il y a plus simpleCode:*(mot+2)='b'
Code:mot[2]='b'
Gni ? Quel est le sens de cette pensée profonde ?Citation:
Envoyé par Skyrunner
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...
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.Citation:
Envoyé par Médinoc
Code:
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:
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'
avec DevC++, le 2nd programme fonctionne alors que le 1er se plante à l'exécution,
Code:
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 ceCode:
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 ;Citation:
Envoyé par HRS
provoqueCode:
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:
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:
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 évidemmentCode:
1
2
3
4 ../main.c: In function `main_': ../main.c:5: error: assignment of read-only location
Code:
1
2
3
4
5
6
7
8 #include <stdio.h> int main (void) { char toto[] = "titi"; toto[1] = 'a'; return 0; }
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?
Citation:
Envoyé par Médinoc
Version 'basique'Code:
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:-O2 -Wextra -Wall
Version 'affinée'Code:-O2 -Wextra -Wall -ansi -pedantic
A tout ça, on peut ajouterCode:
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-long
mais il va falloir modifier les includes de gcc... Je ne m'y risquerais pas...Code:-Werror
Medinoc :Code:
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.Citation:
Par contre, il est possible en effet qu'il y ait une segfault...
Ce code est donc à exclure.
Bonjour,
Pas forcement :Citation:
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.Citation:
Envoyé par Emmanuel Delahaye