2017-08-27 1 views
1

Ich habe eine C++ Funktion geschrieben, die wie folgt dargestellt werden kann: Alles, was es tut, ist eine Zeichenfolge (das ist, wo es abstürzt) und es umzukehren.Zeichen Array von dynamischer Länge

#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; 
} 

Ich denke, es gibt eine Art von Speicherzugriffsverletzung.

Jeder Hinweis, warum das nicht funktioniert?

Fehler: Segmentation fault (core dumped)

+0

'char * str;' - man kann nie Speicher für einen String zuweisen -> Sie Rufen Sie * undefined Verhalten * auf. Wenn Sie in C++ schreiben, verwenden Sie einfach 'std :: string' anstelle von' char'-Arrays im C-Stil. (Auch ['std :: gets '] (http://en.cppreference.com/w/cpp/io/c/gets) ist in C++ veraltet und wurde in C++ entfernt 14) – UnholySheep

+0

C++ und C aren' t die gleiche Sprache. Wähle einen von ihnen aus und versuche dann, deine Aufgabe zu lösen. – pmaxim98

+0

Ich habe das C-Tag entfernt, da dies eindeutig C++ ist – 4386427

Antwort

2

In es ist viel einfacher und weniger fehleranfällig Lösung für dieses Problem über std::reverse von algorithm. Es ist auch einfacher zu verwenden 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; 
} 

Wenn Sie es über char-Arrays zu tun haben, versuchen Sie dies (Sie brauchen nicht auch dynamische Speicherzuweisung)

#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

Ihr Code ist nicht C++ Stil und ich empfehle Ihnen nehmen ein Blick auf die Antwort von Filip (https://stackoverflow.com/a/45903067/4386427)

Ich werde nur adressieren, was schief geht mit Ihrem Code.

Wenn Sie das tun

char* str; 

alles, was Sie bekommen, ist ein Zeiger, der auf eine char verweisen. Sie erhalten keinen Speicher für das Halten einer char. Außerdem ist der Wert der Zeigervariablen str nicht initialisiert. So

wenn Sie das tun

strlen(str) 

Sie eine nicht initialisierte Variable lesen und versuchen, diese nicht initialisierten Wert als C-String zu behandeln. Das ist undefiniertes Verhalten und führt sehr wahrscheinlich zu einem Programmabsturz.

Sie müssen sicherstellen, dass str initialisiert ist, bevor Sie es verwenden. Wie Sie dynamische Speicher möchten, können Sie tun:

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

Aber wieder - ich würde nicht diesen Stil in C++ verwenden Code