2016-04-07 32 views
1

Bir kullanıcı giriş dizesini bir diziye ayrıştırmaya çalışıyorum. Example: user inputs "hello to you" array[0]="hello" array[1]="to" array[2]="you' Kullanıcıdan bazı kelimeler girmesini istediğimde, program sonsuz döngü gibi görünüyor. Ayrıca bir vektör kullanmayı denedim, bu yüzden başka bir alandaki mantığım olabilir. C diline gelince çok paslıyım, lütfen cehaletimi bağışlayın. Herhangi bir yardım büyük takdir edilecektir!C++ dize dizisi sonsuz döngüsüne kullanıcı girişi

#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

, 'std :: getline' kullanın. Alternatif olarak, 'i <2' ifadesini ekleyerek, döngünüzü sonlandırın (ve dizinin üzerine taşmayın). Yani (string giriş; i < 2 && cin >> giriş; i ++) ' – paddy

+0

Belki de programınızın davranışını, problemi beklediğiniz konumun etrafına bakmak için bir hata ayıklayıcı kullanmalısınız. –

+0

Gönderdiğiniz kodda sorunuzu eşleşen hiçbir şey bulamadım. Bana ne sorduğun belli değil. –

cevap

2

Döngü koşullarınız cin >> input'dur. Bu ifade, örtülü olarak bir boole (http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool) dönüştürülebilen cin döndürür. Ancak, cin yalnızca bir hata varsa veya dosyanın sonuna eriştiyseniz (EOF) false olur. Ctrl + D tuşlarına basarak EOF sinyalini verebilirsiniz.

Ayrıca, kullanıcıdan aldığınız bilgileri depolamak için sabit boyutlu bir dizi kullandığınızı unutmayın. Bu kötü, çünkü kullanıcı 2 kelimeden fazla girerse, word dizisi taşacak. Bu tanımlanmamış bir davranış. Bir dosya boyutu, ardından

sadece bir dosya adı istiyorsanız

, neden kullanmayın:

girmek için metin satırı istiyorsanız
std::string filename; 
std::size_t filesize; 
std::cin >> filename >> filesize; 
+1

Eğitmen, bazı sebeplerden dolayı değişkenleri saklamak için bir dizi kullanmamızı istedi. Ben sadece bu yöntemle gidiyorum, çünkü gerçek dünyada ne olacağı gibi görünüyor. Yardım ettiğin için teşekkür ederim!! – Tangwheeler