2016-04-07 3 views
1

Я пытаюсь разобрать входную строку пользователя в массив. Example: user inputs "hello to you" array[0]="hello" array[1]="to" array[2]="you' После того, как я попрошу пользователя ввести несколько слов, программа кажется бесконечно замкнутой. Я также попытался использовать вектор, так что это может быть моя логика в другой области. Я очень ржавый, когда речь заходит о языке C, поэтому, пожалуйста, извините мое невежество. Любая помощь будет принята с благодарностью!C++ пользовательский ввод в строковый массив бесконечный цикл

#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

Если вы хотите ввести строку текста, используйте 'зЬй :: getline'. В качестве альтернативы, сделайте цикл завершенным (а не переполнением массива), добавив 'i <2'. то есть 'для (ввод строки, i < 2 && cin >> input; i ++)' – paddy

+0

Возможно, вам следует использовать отладчик, чтобы посмотреть на поведение вашей программы вокруг позиции, где вы ожидаете проблемы. –

+0

Я ничего не нашел в вашем размещенном коде, который соответствует вашему вопросу. Мне непонятно, что вы просите. –

ответ

2

Состояние вашей петли cin >> input. Это выражение возвращает cin, который может быть неявно преобразован в логическое значение (http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool). Однако cin будет только false, если есть ошибка или вы достигли конца файла (EOF). Вы можете подать сигнал EOF, нажав Ctrl + D.

Обратите внимание, что вы используете массив фиксированного размера для хранения информации, которую вы получаете от пользователя. Это плохо, потому что если пользователь вводит более двух слов, массив word будет переполняться. Это неопределенное поведение.

Если вы просто хотите, имя файла, после чего размер файла, почему бы вам не просто использовать:

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

Инструктор хотел, чтобы мы почему-то использовали массив для хранения переменных. Я просто использую этот метод, потому что это похоже на то, что произойдет в реальном мире. Спасибо за вашу помощь!! – Tangwheeler

Смежные вопросы