2017-08-27 4 views
1

J'ai écrit une fonction C++ qui peut être représentée comme ci-dessous: Tout ce qu'elle fait est de prendre une chaîne de caractères (c'est là qu'elle plante) et de l'inverser.Tableau de caractères de longueur dynamique

#include <iostream> 
#include <string.h> 
#include <stdio.h> 
using namespace std; 
int main() 
{ 
cout<<"Enter a string: "<<endl; 
char *str; 
gets(str); 
cout<<"Reversed String is: "; 
for(int i=strlen(str)-1;i>=0;i--) 
    cout<<(str[i]); 
return 0; 
} 

Je suppose qu'il existe une sorte de violation d'accès à la mémoire.

Qu'est-ce qui ne fonctionne pas?

Erreur: Segmentation fault (core dumped)

+0

'char * str,' - vous jamais allouer de la mémoire pour une chaîne -> vous appelle un comportement non défini *. Si vous écrivez en C++, utilisez 'std :: string' à la place des tableaux' char' de style C. (Aussi ['std :: gets'] (http://en.cppreference.com/w/cpp/io/c/gets) est obsolète en C++ et a été supprimé en C++ 14) – UnholySheep

+0

C++ et C aren ' t la même langue. Choisissez l'un d'entre eux et essayez ensuite de résoudre votre tâche. – pmaxim98

+0

J'ai enlevé le C-tag car c'est clairement C++ – 4386427

Répondre

2

Dans il est beaucoup plus facile et moins sujettes à l'erreur solution à ce problème par l'intermédiaire de std::reversealgorithm. En outre, il est plus facile à utiliser std::string.

#include <iostream> 
#include <algorithm> 

int main() 
{ 
    std::string input; 
    std::cout << "Enter string to reverse: "; 
    std::cin >> input; 
    std::reverse(input.begin(),input.end()); 
    std::cout << "Reversed string: " << input << std::endl; 
    return 0; 
} 

Si vous devez le faire par l'intermédiaire des réseaux de char, essayez ceci (vous ne même pas besoin allocation dynamique de mémoire)

#include <iostream> 
#include <algorithm> 
#include <cstring> 

int main() 
{ 
    char input[1024]; 
    puts("Enter string to reverse: "); 
    fgets(input, 1024, stdin); 
    std::reverse(input, input + strlen(input)); 
    printf("Reversed string: %s", input); 
    return 0; 
} 
2

style de votre code n'est pas C++ et je vous recommande de prendre un coup d'oeil à la réponse de Filip (https://stackoverflow.com/a/45903067/4386427)

Je vais juste répondre à ce qui ne va pas avec votre code.

Lorsque vous faites

char* str; 

tout ce que vous obtenez est un pointeur qui peut pointer vers un char. Vous n'avez pas de mémoire pour avoir un char. En outre, la valeur de la variable de pointeur str n'est pas initialisée.

Alors quand vous faites

strlen(str) 

vous lire une variable non initialisée et essayer de traiter cette valeur non initialisée comme une chaîne C-style. Ce comportement n'est pas défini et risque fort de causer un plantage du programme.

Vous devez vous assurer que str est initialisé avant de l'utiliser. Comme vous voulez la mémoire dynamique, vous pouvez faire:

char *str; 
str = new(char[100]); // Initialize str to point to a dynamic allocated 
         // char array with size 100 
... 
... 
delete(str); 

Mais encore une fois - je ne voudrais pas utiliser ce style en C++ Code