[英]Why is the value of closing bracket character sometimes not ')' after reading input from std::cin?
[英]std::cin sometimes hangs, sometimes repeats forever after invalid input
在這種情況下,當標記為hang point
的線接收到無效輸入時,例如。 abc
,它重復內部的do-while循環並再次到達該行時掛起。
// 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
圖2:您必須在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());
我的印象是您正在重置標志,但是cin緩沖區仍然已滿。 因此,當它重新進入循環時,將自動重新分配字母值(例如,您在終端輸入的“ abc”)“ d”。 因此,失敗標志將被重置,並且循環再次重復。
這是固定版本(進行了一些樣式更改,對此感到抱歉):
#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());
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.