2016-04-07 13 views
1

Ich versuche, eine Benutzereingabezeichenfolge in ein Array zu analysieren. Example: user inputs "hello to you" array[0]="hello" array[1]="to" array[2]="you' Nachdem ich den Benutzer aufgefordert habe, einige Wörter einzugeben, scheint das Programm endlos zu laufen. Ich habe auch versucht, einen Vektor zu verwenden, also kann es meine Logik in einem anderen Bereich sein. Ich bin sehr eingerostet, wenn es um die Sprache C geht, entschuldige bitte meine Unwissenheit. Jede Hilfe würde sehr geschätzt werden!C++ Benutzereingabe in String-Array-Endlosschleife

#include <iostream> 
#include <string> 
#include <sstream> 

using namespace std; 

struct FATNode; 
struct FileNode; 
class FileList; 

class FAT 
{ 
    FATNode* head; 

}; 

class FileList 
{ 
    FileNode* head; 

    //methods 
    public: 
     int createfile() 
     { 
      string word[2]; 
      cout << "Please input file name, followed by file size: "; 

      int i = 0; 
      for (string input; cin >> input; i++) 
        word[i] = input; 

      for(i=0; i<2; i++) 
       cout << word[i] << ' '; 
      return 0; 
     } 

}; 

struct FileNode 
{ 
    string filename; 
    int filesize; 
    FAT t1; 
    FileNode* next; 
}; 

struct FATNode 
{ 
    int sectornumber; 
    FATNode* next; 
}; 

main() 
{ 
    FileList myFileSystem; 
    char start; 
    int cmd; 
    bool cont = true; 

    while(cont == true) 
    { 
     cout << "Initializing disk.\n" << "To access menu, type 'Y'. To exit, type 'N': "; 
     cin >> start; 

     if(start == 'y' || start == 'Y') 
     { 
      cout << "What command would you like to execute on the disk?" << endl; 
      cout << "1. Format disk\n2. Create file\n3. Delete file\n"; 
      cout << "4. List\n5. Read file\n6. Overwrite file\n7. Append to file\n8. Disk status\nSelection: "; 
      cin >> cmd; 

      switch(cmd) 
      { 
       case 1 : 
        break; 
       case 2 : 
         myFileSystem.createfile(); 
        break; 
       default : 
         cout << "Invalid command" << endl; 
      } 
     } 
     else if(start == 'n' || start == 'N') 
     { 
      cont = false; 
     } 
     else 
     { 
      cout << "Invalid input." << endl; 
     } 
    } 
} 
+0

Wenn Sie eingeben möchten eine Textzeile, verwenden Sie 'std :: getline'. Alternativ können Sie dafür sorgen, dass Ihre Schleife beendet wird (und das Array nicht überläuft), indem Sie 'i <2 'hinzufügen. d. h. 'for (string input; i < 2 && cin >> input; i ++)' – paddy

+0

Vielleicht sollten Sie einen Debugger verwenden, um das Verhalten Ihres Programms an der Stelle zu untersuchen, an der Sie das Problem erwarten. –

+0

Ich konnte in Ihrem geposteten Code nichts finden, der Ihrer Frage entspricht. Es ist mir nicht klar, was du fragst. –

Antwort

2

Ihre Schleifenbedingung ist cin >> input. Dieser Ausdruck gibt cin zurück, der implizit in einen booleschen Wert (http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool) konvertiert werden kann. cin wird jedoch nur false, wenn ein Fehler auftritt oder wenn Sie das Ende der Datei erreicht haben (EOF). Sie können EOF signalisieren, indem Sie Strg + D drücken.

Beachten Sie auch, dass Sie ein Array fester Größe verwenden, um Informationen zu speichern, die Sie vom Benutzer erhalten. Das ist schlecht, denn wenn der Benutzer mehr als 2 Wörter eingibt, wird das Array word überlaufen. Das ist undefiniertes Verhalten.

Wenn Sie nur einen Dateinamen möchten, indem eine Dateigröße gefolgt, warum Sie nicht nur verwenden:

std::string filename; 
std::size_t filesize; 
std::cin >> filename >> filesize; 
+1

Der Ausbilder wollte, dass wir aus irgendeinem Grund ein Array verwenden, um die Variablen zu speichern. Ich gehe aber nur mit dieser Methode, weil es mehr wie in der realen Welt zu sein scheint. Danke für Ihre Hilfe!! – Tangwheeler