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 pasVous 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 pasVous 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'
Gni ? Quel est le sens de cette pensée profonde ?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.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'
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; }
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?
Envoyé par Médinoc
Version '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
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.
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