在這種情況下,當標記爲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 1
或figure 2
做他們做的。
編輯:我一直在導致cin
通過在我爲自己寫的提示中輸入字母數據而失敗。例如。
s = something
d = 3
s = something
d = a
你對'std :: cin'提供了什麼輸入? – user657267
我一直用來使'std :: cin >> d;'失敗的輸入通常是單個字母字符,例如。 'a'或'r'什麼的。 – anthropomorphic
對,但你到底輸入了什麼?直接在終端?用文件重定向?將你的輸入和輸出複製到你的問題。 – user657267