2012-09-07 2 views
1

J'essaie d'inverser une chaîne terminée par un caractère nul en place dans C++. J'ai écrit le code ci-dessous:Essayer d'inverser une chaîne en place

//Implement a function to reverse a null terminated string 

#include<iostream> 
#include<cstdlib> 

using namespace std; 
void reverseString(char *str) 
{ 
    int length=0; 
    char *end = str; 
    while(*end != '\0') 
    { 
     length++; 
     end++; 
    } 
    cout<<"length : "<<length<<endl; 
    end--; 

    while(str < end) 
    { 

     char temp = *str; 
     *str++ = *end; 
     *end-- = temp; 


    } 

} 
int main(void) 
{ 
    char *str = "hello world"; 
    reverseString(str); 
    cout<<"Reversed string : "<<str<<endl; 
} 

Cependant, quand je lance ce programme C++, je reçois aa violation d'accès en écriture à l'intérieur de la boucle while à la déclaration: *str = *end ;

Même si cela est assez simple, je n'arrive pas à comprendre la raison exacte pour laquelle je reçois cette erreur.

Pourriez-vous s'il vous plaît m'a aider à identifier l'erreur?

Répondre

5
char *str = "hello world"; 

est un pointeur sur un littéral de chaîne et ne peut pas être modifié. Les littéraux de chaîne résident dans la mémoire en lecture seule et la tentative de les modifier entraîne un comportement non défini . Dans votre cas, un accident.

Comme il s'agit clairement d'une tâche, je ne vais pas suggérer d'utiliser std::string à la place, car il est bon d'apprendre ces choses. Utilisation:

char str[] = "hello world"; 

et cela devrait fonctionner. Dans ce cas, str serait une variable de stockage automatique (pile).

+0

merci beaucoup! est venu à connaître une nouvelle chose! –

Questions connexes