2017-05-31 27 views
-1

我想用一個無限循環來讀Person結構(名字,年齡,薪水)。我想在用戶輸入名稱爲'x'時打破循環。當讀取結構數據時CPP infinit while循環錯誤?

#include <iostream> 
#include <vector> 
using namespace std; 

struct Person 
{ 
    char name[50]; 
    int age; 
    float salary; 
}; 

int main(int argc, const char * argv[]) { 
    Person p1; 
    vector <Person> p1_vec; 
    while (true) { 
     cout << "Enter Full name or simply 'x' to exit: "; 
     cin.get(p1.name, 50); 
     bool next_entry = strcmp(p1.name,"x"); 
     if (!next_entry) { 
      break; 
     } 
     cout << "Enter age: "; 
     cin >> p1.age; 
     cout << "Enter salary: "; 
     cin >> p1.salary; 
     p1_vec.push_back(p1); 
    } 
} 
+0

請問Q/A指南知道如何提問。 – Sam

+1

那麼_actually_發生了什麼?問題是什麼? –

回答

0

您需要忽略你讀一salary輸入後獲得新的行字符:

cin >> p1.salary; 

做:

cin >> p1.salary; 
cin.ignore(1, '\n'); 

將使代碼停在這裏:

cin.get(p1.name, 50); 

an d等待另一個用戶輸入!

0

cin狀態需要讀取後清零,你可以試試:

cin.clear(); 
cin.ignore(std::numeric_limits<streamsize>::max(), '\n'); 

例如(取決於誤差容許量你想)

while (true) 
{ 
    cout << "Enter Full name or simply 'x' to exit: "; 
    cin.get(p1.name, 50); 
    cin.clear(); 
    auto equal = strcmp(p1.name, "x")==0; 
    if (equal) 
    { 
     break; 
    } 
    cout << "Enter age: "; 
    cin >> p1.age; 
    cin.clear(); 
    cout << "Enter salary: "; 
    cin >> p1.salary; 
    p1_vec.push_back(p1); 
    cin.clear(); 
    cin.ignore(std::numeric_limits<streamsize>::max(), '\n'); 
} 
0

cin.get(p1.name, 50)不消耗\n ,在進入工資後仍留在輸入緩衝區中;所以它跳過輸入並將值留空。

cin >> p1.name它應該正常工作。

0

從輸入緩衝區獲取數據後,您應該清除它。

int main(int argc, const char * argv[]) { 
    Person p1; 
    vector <Person> p1_vec; 
    while (true) { 
     cout << "Enter Full name or simply 'x' to exit: "; 
     cin.get(p1.name, 50); 
     bool next_entry = strcmp(p1.name,"x"); 
     if (!next_entry) { 
      break; 
     } 
     cout << "Enter age: "; 
     cin >> p1.age; 
     cout << "Enter salary: "; 
     cin >> p1.salary; 
     p1_vec.push_back(p1); 
     cin.clear(); 
     cin.ignore(); 
    } 
}