J'apprends C, et j'essaie d'inverser une chaîne en place à l'aide de pointeurs. (Je sais que vous pouvez utiliser un tableau; c'est plus sur l'apprentissage des pointeurs.) P>
Je continue à obtenir des défauts de segmentation lorsque vous essayez d'exécuter le code ci-dessous. GCC semble ne pas aimer le surtout que mon code est presque identique à La fonction C non malvoyante déjà discutée dans une autre question p> * fin = * commencez; code> ligne . pourquoi est-ce? em> strong> p>
8 Réponses :
Un problème réside avec le paramètre que vous passez à la fonction:
char string[] = "foobar";
Quelque chose comme char * string = strdup ("foobar"); code> fonctionnerait.
Merci beaucoup remo.d. C'est ça!
@ x4u. Oui, mais vous devriez libérer la mémoire renvoyée par STRUP () lorsque vous avez terminé. Pas important dans ce cas, j'admets, mais je ne suggérerais toujours pas d'utiliser STRUP () à moins que ce ne soit la seule option sensible.
@Brice: YW :) Qu'entendez-vous de la lecture de la mémoire en lecture seule?
@ Remo.d: Je n'avais aucune idée que Char Str [] et Char * Str serait différent. J'ai eu l'impression de créer exactement le même objet en mémoire, alors je vais devoir obtenir mon Google-foo sur et apprendre d'autres! Il y a une bonne discussion ici: Stackoverflow.com/Questtions/1704407/...
Juste pour être parfaitement clair, char * s = "bla" code> attribue stockage de 5 caractères quelque part qui peut ou non être en lecture seule. Dans la plupart des cas, le stockage est dans un segment de mémoire en lecture seule à côté du code de la machine pour les instructions de programme. D'autre part,
char s [] = "bla"; code> attribue une matrice modifiable de 5 caractères sur la pile (c'est-à-dire, stockage local). Ceci est toujours modifiable. Jetez un coup d'œil à ( Stackoverflow. com / questions / 2036096 / ... ) Pour plus de détails sur les chaînes littérales.
Je l'ai eu: Kernighan & Richie, chapitre 5.5, page 104, édition 2D, la langue de programmation C. "Le pointeur peut être modifié ultérieurement pour pointer ailleurs, mais le résultat n'est pas défini si vous essayez de modifier le contenu de la chaîne."
Changer char * string = "foobar"; code> à
chargeur de chargeur [] = "foobar"; code>. Le problème est qu'un
char * code> pointe pour lire uniquement la mémoire que vous essayez ensuite de modifier provoquant une défaillance de segmentation. P>
Dans votre code, vous avez ce qui suit:
end--; begin++;
Merci d'avoir attrapé ça. Édité-le.
Voici ma version de l'inversion de chaîne in-place C.
Ceci serait en place et en utilisant des pointeurs
Ceci crée une petite fonction récursive (ish) et fonctionne en stockant les valeurs sur le chemin de la pile et incrémentation du pointeur au début de la chaîne (* s) sur le chemin de la sauvegarde (retour).
Cadeau de recherche intelligente mais affreux en termes d'utilisation de la pile. P>
Vous pouvez également utiliser le caractère NULL à la fin d'une chaîne afin d'échanger des caractères d'une chaîne, évitant ainsi l'utilisation de tout espace supplémentaire. Voici le code:
#include <stdio.h> void reverse(char *str){ int length=0,i=0; while(str[i++]!='\0') length++; for(i=0;i<length/2;i++){ str[length]=str[i]; str[i]=str[length-i-1]; str[length-i-1]=str[length]; } str[length]='\0'; } int main(int argc, char *argv[]){ reverse(argv[1]); return 0; }
ci-dessous, vous pouvez voir mon code pour ce problème:
#include <string> #include <iostream> char* strRev(char* str) { char *first,*last; if (!str || !*str) return str; size_t len = strlen(str); for (first = str, last = &str[len] - 1; first < last ; first++, last--) { str[len] = *first; *first = *last; *last = str[len]; } str[len] = '\0'; return str; } int main() { char test[13] = "A new string"; std::cout << strRev(test) << std::endl; return 0; }
C'est en fait un DUP de Cet article , essayant d'écrire à une chaîne constante - vote pour rouvrir afin que cela puisse obtenir fermé pour le DUP correct.
Dupliquer possible de Pourquoi est-ce que je reçois une défaillance de segmentation lorsque vous écrivez à une chaîne initialisée avec "Char * s" mais pas "Char S []"?
@ Keny-N a du sens pour moi :) a voté pour fermer aussi.