2014-07-16 36 views
0

在這種情況下,當標記爲hang point的行收到無效輸入時,例如。 abc,它會重複內部的do-while循環,並在到達該行時再次掛起。std :: cin有時會掛起,有時會在無效輸入後永久重複

// figure 1 
std::string s; 
do { 
    do { 
     std::cout<<"s = "; 
     std::getline(std::cin, s); 
    } while (s == ""); 
    double d; 
    std::cout<<"d = "; 
    do { 
     std::cin.clear(); 
     std::cin>>d; // hang point 
     std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    } while (std::cin.fail()); 
} while (s != "exit"); 

在這種情況下,程序跳過該行並重復執行do-while循環。

// figure 2 
double d; 
do { 
    std::cout<<"d = "; 
    std::cin.clear(); 
    std::cin>>d; // skip point 
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
} while (std::cin.fail()); 

爲什麼?

最初我會問爲什麼figure 1掛起,並在試圖簡化例子的過程中,我想出figure 2,並發現它並沒有掛起,而是一直重複。我不明白爲什麼要麼figure 1figure 2做他們做的。

編輯:我一直在導致cin通過在我爲自己寫的提示中輸入字母數據而失敗。例如。

s = something 
d = 3 
s = something 
d = a 
+0

你對'std :: cin'提供了什麼輸入? – user657267

+0

我一直用來使'std :: cin >> d;'失敗的輸入通常是單個字母字符,例如。 'a'或'r'什麼的。 – anthropomorphic

+2

對,但你到底輸入了什麼?直接在終端?用文件重定向?將你的輸入和輸出複製到你的問題。 – user657267

回答

2

Figure2:你有cin.ignore之前調用cin.clear()()。否則,cin.ignore將不會執行任何操作,因爲cin仍然處於錯誤狀態。

double d; 
do { 
    if (std::cin.fail()) { 
     std::cin.clear(); 
     std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    } 
    std::cout<<"d = "; 
    std::cin>>d; 
} while (std::cin.fail()); 
+1

請使用數字限制而不是任意常數。 –

+0

@MikePrecup謝謝,忘了那個:P – TheOneWhoSighs

1

我的印象是,您正在重置標誌,但cin緩衝區仍然已滿。因此,當它重新進入循環時,'d'會自動重新分配字母值(例如,您在終端輸入的'abc')。因此故障標誌將被重置,並且循環再次重複。

這裏的固定版本(有一些文體上的修改,我們對此深感抱歉):

#include <string> 
#include <iostream> 

int main(){ 
    std::string s=""; 
    std::string dummy=""; 
    while (s!="exit"){ 
     s=""; 
     while (s==""){ 
      std::cout<<"s = "; 
      std::getline(std::cin, s); 
     } 
     double d; 
     std::cout<<"d = "; 
     do { 
      if (std::cin.fail()){ 
       std::cin.clear(); 
       std::getline(std::cin, dummy); 
       std::cout << "d = "; 
      } 
      std::cin>>d; 
      std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
     } while (std::cin.fail()); 
    } 
} 
相關問題