2009-02-21 1 views
1

J'appelle la fonction fournie par Chris Conway (How do you reverse a string in place in C or C++?) de la main (code C). Quand j'exécute ce programme en utilisant cygwin, le programme se bloque quand il est dans la boucle while (commente les lignes où il se casse). Pourriez-vous s'il vous plaît expliquer ce qui ne va pas ici? MerciC: inverser une chaîne en place. J'ai utilisé le prog répondu dans une question précédente. Il compile ok mais se bloque avec faute de segmentation

#include <stdio.h> 
#include <string.h> 

void strrev(char* z); 

int main() 
{ 
     char *a; 
    printf("before reverse: %s\n", a); 
     strrev(a); // function provided by Chris Conway 
    printf("after reverse: %s\n", a); 
    return 0; 
} 

void strrev(char *str) { 
    char temp, *end_ptr; 

    /* If str is NULL or empty, do nothing */ 
    if(str == NULL || !(*str)) 
    return; 

    end_ptr = str + strlen(str) - 1; 

    /* Swap the chars */ 
    while(end_ptr > str) { 
    temp = *str; 
    *str = *end_ptr; //crashes here (cygwin gives segmentation fault) 
    *end_ptr = temp; //for testing, if I comment out line above, it crashes here 
    str++; 
    end_ptr--; 
    } 
} 
+0

Vous auriez vraiment dû mettre à jour le question originale. – EBGreen

+0

@ EBreen, je crois que c'est une question sans rapport (un peu), et il mérite son propre poste. – strager

+0

Je m'assurerai de faire ça la prochaine fois. Merci. –

Répondre

8

La fonction est très bien, mais votre main() ne semble pas initialiser la chaîne a.

Essayez:

int main() { 
    char a[1024]; 
    strcpy(a, "Some string"); 
    printf("before reverse: %s\n", a); 
    strrev(a); // function provided by Chris Conway 
    printf("after reverse: %s\n", a); 
    return 0; 
} 

Notez que je crée une copie de « ficelle » à l'intérieur a (au lieu de directement attribuer char* a = "Some String"), car en essayant de modifier une chaîne constante ne compilera pas directement. Et si vous avez réussi à compiler (par exemple compilateur laxiste, ou vous avez forcé la constité par cast/const_cast) alors vous courez un très grand risque de plantage de votre programme, parce que "Some string" est réellement dans une partie de la mémoire qui est lue -seulement sur certains systèmes, c'est pourquoi une copie doit être faite dans une variable locale (ie sur la pile) ou une nouvelle variable (allouée avec new ou malloc, ie sur le tas.)

+0

Ou il peut faire: const char * a = "Some string"; – strager

+0

Non, s'il l'a fait que strrev tentera de modifier un const, qui ne devrait pas compiler. De plus, puisque le const provient en fait de l'image exécutable elle-même, même si le programme a été forcé de compiler, un crash peut s'ensuivre (en essayant de modifier la mémoire mappée sur l'image exec.) – vladr

+0

Thanks Vlad. En fait j'ai utilisé: char * a = "Some string"; strrev (a). Dans ce cas, il compile mais se bloque. Est-ce que l'initialisation ci-dessus fait aussi le 'a' - pointeur vers const? Et est-ce la raison, il s'est écrasé? –

Questions connexes