Modification d'un caractère dans un tableau - C - Programmation
Marsh Posté le 16-08-2007 à 20:35:01
Mouais, classique. Tu modifies une chaine statique. Les compilos marque la zone occupée par ces chaines en read only. En général, ils en profitent pour optimiser en réutilisant les chaines similaires. Du coup si tu modifiais une chaine, ça pourrait avoir des répercutions dans d'autre partie du code : l'horreur totale.
Il suffit de changer ta ligne 20 en :
Code :
|
Edit: rhôôooo, le serveur avait mis plein de fotes de grammaires, orthos, typos, ... dans mon post !!
Marsh Posté le 16-08-2007 à 20:51:46
Merci de m'avoir répondu aussi vite,
c'est clair que c'est le genre d'erreur classique en c, c'est pas encore trop la joie avec les pointeurs...
mais bon, maintenant il ne compile plus...
il me dit : c:25: error: incompatible types in assignment
j'ai enlever le (char *) mais rien n'y fait...je suis perdu!
Marsh Posté le 16-08-2007 à 21:37:40
c'est bon, ca marche plus ou moins
j'ai changé la ligne 25 par
*temp = NextOne(temp);
maintenant ça compile et ca marche,
mais le problème c'est que j'ai besoin d'appeller la methode NextOne() avec un char * comme arguments et pas un char [] et il me fait à nouveau l'erreur de segmentation...
Marsh Posté le 16-08-2007 à 22:06:46
je ne comprends pas pourquoi ton NextOne retourne quelque chose.
Surtout que ce que tu retournes c'est l'adresse du tableau que tu lui passes en paramètre.
Si tu le déclares en
Code :
|
et que tu retournes rien ça doit bien suffire
Marsh Posté le 16-08-2007 à 22:31:01
segmentation fault à nouveau...
J'aime beaucoup le c, mais la ya vraiment des jours... incapable de changer un caractère dans un tableau ,c'est quand même la gène...
en tout cas merci pour ta réponse SquiZZ.
J'ai modifié ma methode en void, mais ca ne change rien,
char * temp = ... pose tjrs des problèmes.
Quelqu'n aurait une solution?
Marsh Posté le 16-08-2007 à 23:43:08
Oui j'ai fait ce qu'il a dit(et ca a marché),
mais le problème c'est que le bout de code que j'ai montré fait parti d'un programme 10fois plus gros,
ca marchait bien au début mais maintenant j'ai cette erreur de segmentation, j'ai pas fait de sauvegarde assez souvent (shame on me)
et je me retrouve bloqué, si je commence à changer la variable à passer en argument ,je devrais changer tout le programme...
donc je me retrouve toujours avec le même problème de base:
- Comment modifier un élement d'un string définit par : char * temp = "TotoLeHeros"?
j'en deviens dingue
Marsh Posté le 17-08-2007 à 02:00:38
smurf4xp a écrit : |
on ne peut pas
"TotoLeHeros" est une chaine constante
en faisant ça, tu ne fait que dire : "le pointeur temp pointe sur la chaine constante (donc immuable) "TotoLeHeros"", ce qui ne te permet pas de modifier la chaine puisqu'elle est constante
par contre tu peux faire :
Code :
|
mais une fois que tu en auras plus besoin il ne faudrat pas que tu oublie de faire
Code :
|
sinon tu fais simplement
Code :
|
la tu peux la modifier, mais ça t'oblige à changer tout ton programme
Marsh Posté le 17-08-2007 à 12:00:15
merci pour ta réponse deadog!
tu as raison en declarant comme ceci
Code :
|
je ne peux plus changer le string... (est cela qu'on appelle une lvalue?)
J'ai finalement pu résoudre mon problème hier (ou ce matin ?)
pour cela j'ai fait comme suit:
Code :
|
ce qui resolvait mon problème, mais je vais retenir ta solution (je ne connaissais pas strdup).
Je remercie tout ceux qui m'ont aidé, c'est franchement sympa ce que vous faites.
Continuez comme ca !
Marsh Posté le 17-08-2007 à 13:33:03
hum, strdup te fait le malloc + le strcpy
ce qui n'est pas plus mal parce que dans ce que tu as fais tu prend un gros risque : tu paris sur le faite que le bout de mémoire alloué par malloc contient initiallement que des 0, ce qui n'est pas toujours le cas.
malloc tu donne un bout de mémoire sans la remettre à zero, donc tu peux très bien obtenir ce qu'il y avant, c'est à dire tout et n'importe quoi, et en particulier pas forcément des 0
ton strncpy s'arrête à 8 et ne met donc pas le 0 final
tiré de la page man de strncpy :
Citation : La fonction strncpy() est identique, sauf que seuls les n premiers octets de src sont copiés. Ainsi, s’il n’y a pas de caractère nul dans les n premiers octets de src, la chaîne résultante ne disposera pas de caractère nul final. |
Chez toi ça a marché uniquement parce que tu as eu la chance que malloc te retourne un bout de mémoire avec que des 0.
Pour éviter ça tu peux utiliser strdup dans ce cas particulier, et plus générallement tu peux utiliser calloc :
Code :
|
calloc t'alloue une zone mémoire et te la met à zéro
une autre méthode et de faire ça à chaque fois que tu utilise strncpy :
Code :
|
Marsh Posté le 17-08-2007 à 13:57:43
smurf4xp a écrit :
j'obtiens une erreur de segmentation lorsque j'essaie d'assigner une valeur dans le tableau. (ligne 54) |
Il suffit d'utiliser une chaine modifiable :
Code :
|
Marsh Posté le 16-08-2007 à 20:23:26
Bonjour,
je suis en train de faire un programme pour un de mes cours et ca fait quelques heures maintenant que j'ai la même erreur sans pouvoir la résoudre...
j'obtiens une erreur de segmentation lorsque j'essaie d'assigner une valeur dans le tableau. (ligne 54)
Je rame à mort, j'espere que quelqu'un d'entre vous pourra m'aider.
Merci d'avance pour toute aide!