2016-04-22 8 views
0
#include <iostream> 
    #include <string> 

    int main(){ 

    char p; 
    bool show_cleartext; 
    std::string input; 
    std::cout << "Would you like the output to show your original text? [y/n] \n"; 
    while(true){ 
     std::cin >> input; 
     if(input == "y"){show_cleartext = true; break;} 
     else if(input == "n"){show_cleartext = false; break;} 
     else std::cout << "[y/n] ? \n"; 
    } 
    while(true){ 
     // Promts for 'input' then displays input, reversed 
     std::getline(std::cin,input); 
     if(input == "quit")break; 
     for(int i = 0; i < (input.length()-1)/2; ++i){ 
      p = input[input.length()-i-1]; 
      input[input.length()-i-1] = input[i]; 
      input[i] = p; 
     } 
     std::cout << input+'\n'; 
    } 

    return 0; 
} 

Jede While-Schleife ist in Ordnung. Jedoch schließt das Einschließen von beiden das Programm ab, sobald es über das erste hinausgeht, d. H. Durch Eingabe von "y" oder "n".Warum verursachen zwei while() - Schleifen einen Absturz?

+1

Meine Vermutung: In der zweiten Schleife ist 'input' eine leere Zeichenfolge,' input.length() 'ist null,' input.length() - 1' wird zu einer sehr großen Zahl umgebrochen, und Sie greifen darauf zu Index außerhalb der Grenzen. –

+0

Ich dachte, du wärst richtig, aber initialisiere Eingabe als "asdasd" oder etwas hilft nicht. EDIT: Die Änderung zwischen den While-Schleifen macht nichts – basket

+0

[Works für mich] (http://rexttester.com/ESZT28102) –

Antwort

0

Wenn Sie den Benutzer fragen, ob input „quit“, die input Größe wird „“ oder 0. Also im Grunde input ist eine leere Zeichenfolge und wenn Sie input.length() tun, und es ist gleich 0 es umschlingt auf eine riesige große Zahl und dass verursacht den Absturz. Dies ist, was ich von meinem Debugger bekommen habe und ich empfehle Ihnen, auch einen zu verwenden.

Um dies zu beheben, die std::getline(std::cin,input);

entfernen, die die input Größe zurücksetzt.

+0

Ich habe versucht einfach zu entfernen 'std :: getline (Std :: cin, Eingabe);' aber es stürzt genauso ab. Ihre Bemerkungen lokalisieren das Problem in der zweiten While-Schleife, aber das Programm läuft gut, nur die zweite Schleife und die erste wird entfernt. Endlich 'std :: getline (std :: cin, input);' ist, was tatsächlich "Eingabe" durch den Benutzer zuweist. 'cin' liest keine Leerzeichen in der Vergangenheit. – basket

+2

Ich habe gerade festgestellt, dass das Problem die zweite Schleife ist, wenn Sie nur ein Zeichen eingeben. Ich kann von hier fortfahren. Danke – basket

+0

Kein Problem. Ich bin froh, dass ich dir irgendwie geholfen habe. – Auriga

0

Ich denke, dieser Ausdruck: p = Eingabe [input.length() - i-1]; führt zu -1 Index im Eingabearray. Also, wenn Sie 0 Eingang haben, erhalten Sie den Fehler. Vielleicht versuchen:

 #include <iostream> 
    #include <string> 

    int main(){ 

    char p; 
    bool show_cleartext; 
    std::string input; 
    std::cout << "Would you like the output to show your original text? [y/n] \n"; 
    while (true){ 
     std::cin >> input; 
     if (input == "y"){ show_cleartext = true; break; } 
     else if (input == "n"){ show_cleartext = false; break; } 
     else std::cout << "[y/n] ? \n"; 
    } 
    while (true){ 
     // Promts for 'input' then displays input, reversed 
     std::cout << "Input: "; 
     std::cin >> input; 
    // std::getline(std::cin, input); 
     if (input == "quit")break; 
     for (int i = 0; i < (input.length() - 1)/2; ++i){   
      if (input.length() != 0) 
      { 
       p = input[input.length() - i - 1]; 
       input[input.length() - i - 1] = input[i]; 
       input[i] = p; 
      }      
     } 
     std::cout << input + '\n'; 

     break; 

    } 
    system("pause"); 
    return 0; 
} 
0

Das Problem ist die Verwendung von std::getline(std::cin,input);. getline extrahiert die Zeichen aus istream, bis ein Trennzeichen oder \n erreicht ist. In Ihrem Fall enthält der istream-Puffer aus dem vorherigen std::cin\n. Dies führt zu einer Zeichenkette der Größe 0

Zweitens gibt input.length()size_t zurück, der vorzeichenloser Integraltyp ist. In diesem Fall wird input.length() - 1 zu einer großen Zahl und die Schleifenbedingung wird als wahr ausgewertet. Anschließend wird ein Segmentierungsfehler auf dem Zugang von input[input.length()-i-1]; erhält

Um den Fehler zu vermeiden, können Sie std::getline(std::cin,input) mit std::cin >> input in der 2. while Schleife ersetzen oder std::cin >> input mit std::getline(std::cin,input) im ersten ersetzen.

Verwandte Themen