2015-11-20 206 views
0

我試圖用cin.getline()函數得到一個空格字符串,但是當我這樣做時,我的程序無休止地循環。我加了'\n',但它不起作用。cin.getline進入無限循環

我真的不知道我在做什麼錯。誰能幫忙?

#include <iostream> 
using namespace std; 

#include "HealthClub.h" 

void main() 
{ 
    int i, ans=0; 
    char tname[20] = { 0 }, dname[20] = { 0 }; 
    HealthClub newhc; 
    cout << "please enter the new trainer`s name:" << endl; 
    cin.getline(tname, 20, '\n'); 
    newhc.addTrainer(tname); 
} 

enter image description here

enter image description here

+3

不要發佈您的代碼爲圖像。請[編輯]你的問題[mcve] – NathanOliver

+0

你的代碼根本沒有循環。你確定它*無限循環*嗎? – user2079303

+0

對不起,我的意思是它只是打印我「請輸入新的教練的名字:」一次又一次。 –

回答

-1
while (ans != 7) 
{ 
    cin >> ans; 
    switch (ans) 
    { 
     case 1: 
     { 
      cout << "please enter the new trainer`s name:" << endl; 
      cin.getline(tname, 20, '\n'); 
      newhc.addTrainer(tname); 
     } 
     break; 
    // ... 

你從來沒有在這種情況下塊改變ansans之後仍然是1,while循環剛剛開始並再次進入第一個語句。

它與getline()無關。

+0

相關部分是由'getline()'引起的。看到我的答案 –

0

您有2個問題。

第一個已被cdonat描述。想想當你輸入1時會發生什麼。

  1. ans是1
  2. 時,執行case 1一部分。
  3. 檢查while條件。
  4. 循環再次執行作爲ANS是1

也許這甚至期望的行爲 - 我不知道。

你的第二個問題是不合格的getlinegetline不會從輸入流中移除換行符。 當您致電cin >> ans;時,剩餘的換行符將用作觸發器。

根據使用的C++版本,當輸入無效時,cin>>不會更改它寫入的值。

由於您的輸入流是一個換行符,因此不斷將空字符串傳遞給ans。所以ans永遠不會從1改變。

相同的行爲也會導致getline直接返回空字符串。

您需要在調用getline以清除/忽略剩餘數據後清除輸入流。您cin.getline()後 添加到cin.ignore();呼叫這樣

cin.getline(tname, 20, '\n'); 
cin.ignore();