cin.clear() 和 cin.ignore() 不起作用[关闭]

Posted

技术标签:

【中文标题】cin.clear() 和 cin.ignore() 不起作用[关闭]【英文标题】:cin.clear() and cin.ignore() won't work [closed] 【发布时间】:2016-12-09 16:00:05 【问题描述】:

我对这个问题进行了大量研究,找到了一些答案并更正了我的代码,但我仍然无法让 cin.clear()cin.ignore() 工作。这是我所指的代码的一部分:

if(cityname1 == "Error" || cityname2 == "Error")

    cout << "**********ERROR! PLEASE ENTER 0-5 FOR YOU LOCATIONS**********" << endl << endl;
    cin.clear();
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    detailLoop();

else

    cout << "The distance from " << cityname1 << " to " << cityname2;
    cout << " is approximately " << cityarray[start][finish] << " miles." << endl << endl;

如果用户输入了 0-5 以外的数字,则会输出错误消息,但如果输入字符,则代码会进入无限循环。经过研究,我觉得这段代码应该可以工作,但不幸的是我做不到。另外,我是初学者,所以如果有人对本文的写作方式有任何建议,请批评!!!如果有帮助,这是整个功能。我做了#include&lt;limits&gt;

void detailLoop()

//initializes array(letters in comments stand for city;
//array values are the distances)
int cityarray[6][6] = 
    //DB-DB,DB-G,DB-J,DB-M,DB-Tall,DB-Tampa
    0,97,90,268,262,130,

    //G-DB,G-G,G-J,G-M,G-Tall,G-Tampa
    97,0,74,337,144,128,

    //J-DB,J-G,J-J,J-M,J-Tall,J-Tampa
    90,74,0,354,174,201,

    //M-DB,M-G,M-J,M-M,M-Tall,M-Tampa
    268,337,354,0,475,269,

    //Tall-DB,Tall-G,Tall-J,Tall-M,Tall-Tall,Tall-Tampa
    262,144,174,475,0,238,

    //Tampa-DB,Tampa-G,Tampa-J,Tampa-M,Tampa-Tall,Tampa-Tampa
    130,128,201,269,238,0
    ;

//starting location
int start = 0;
//destination
int finish = 0;
//strings used to print city names
string cityname1;
string cityname2;
//menu block
cout << "Choose locations from the menu below:" << endl;
cout << "0 - Daytona Beach" << endl;
cout << "1 - Gainesville" << endl;
cout << "2 - Jacksonville" << endl;
cout << "3 - Miami" << endl;
cout << "4 - Tallahassee" << endl;
cout << "5 - Tampa" << endl << endl;

//user input for starting city
cout << "Enter your starting location: > "; cin >> start;

//user input for ending city
cout << "Enter your destination: > "; cin >> finish; cout << endl;

//assigns names to cityname1 so it can be printed
switch(start)

case 0:
    cityname1 = "Daytona Beach";
    break;
case 1:
    cityname1 = "Gainesville";
    break;
case 2:
    cityname1 = "Jacksonville";
    break;
case 3:
    cityname1 = "Miami";
    break;
case 4:
    cityname1 = "Tallahassee";
    break;
case 5:
    cityname1 = "Tampa";
    break;
default:
    cityname1 = "Error";
    break;


//assigns names to cityname2 so it can be printed
switch(finish)

case 0:
    cityname2 = "Daytona Beach";
    break;
case 1:
    cityname2 = "Gainesville";
    break;
case 2:
    cityname2 = "Jacksonville";
    break;
case 3:
    cityname2 = "Miami";
    break;
case 4:
    cityname2 = "Tallahassee";
    break;
case 5:
    cityname2 = "Tampa";
    break;
default:
    cityname2 = "Error";
    break;


if(cityname1 == "Error" || cityname2 == "Error")

    cout << "**********ERROR! PLEASE ENTER 0-5 FOR YOU LOCATIONS**********" << endl << endl;
    cin.clear();
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    detailLoop();

else

    cout << "The distance from " << cityname1 << " to " << cityname2;
    cout << " is approximately " << cityarray[start][finish] << " miles." << endl << endl;


【问题讨论】:

您确定问题出在clear()ignore() 上,而不是您的代码所做的其他假设吗?因为如果你确定,你应该有一个短得多、只有几行代码的可编译示例,这里的每个人都可以使用它来重现你的问题。 (不涉及城市名称、距离计算等)我们称之为MCVE。 如果用户在start中输入了一个非数字,它将为零。它不会是“一些不是我后来认为有效的值”。 这里学到的教训:要处理用户输入的一行文本,请始终使用std::getline(),这样您就不必费力尝试清除和重置失败的输入流.这就是 std::getline() 的用途,而不是 &gt;&gt; 运算符。 【参考方案1】:

最后我发现所有这些类型的阅读器都是无用和疯狂的,试图为阅读交互式输入而工作。你基本上最终会与终端和输入缓冲区发生冲突。

cin.clear() 在处理标准输入和交互式会话的解析提示时没有做任何合理的事情。你不应该打电话给它。

根据 cin.getline() 重写所有内容并解析结果字符串,您将能够了解故障模式并修复它们。

【讨论】:

【参考方案2】:

您应该结合您的条件使用cin.fail()

if(cin.fail()||cityname1 == "Error" || cityname2 == "Error")

cout << "**********ERROR! PLEASE ENTER 0-5 FOR YOU LOCATIONS**********" << endl << endl;
cin.clear();
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
detailLoop();

【讨论】:

【参考方案3】:

您的代码works fine,如果您的main() 如下所示:

int main()  detailLoop(); 

我怀疑您在循环中调用detailLoop,这会导致无限循环。

【讨论】:

以上是关于cin.clear() 和 cin.ignore() 不起作用[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

cin.clear()cin.sync()

错误处理

清空缓存区,避免对缓存区中残留数据对下次读入造成影响

c ++中while循环的意外行为

C++ 中的 Getline 和 cin.ignore

cpp►cin.ignore()函数——缓冲区