首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cin.clear()和cin.ignore()不能工作

cin.clear()和cin.ignore()不能工作
EN

Stack Overflow用户
提问于 2016-12-09 16:00:05
回答 3查看 561关注 0票数 0

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

代码语言:javascript
复制
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<limits>

代码语言:javascript
复制
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;
}
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-12-09 16:22:46

您应该使用cin.fail()以及您的条件

代码语言:javascript
复制
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();
}
票数 0
EN

Stack Overflow用户

发布于 2016-12-09 16:19:54

最后,我发现所有这些打字的读者都是无用和疯狂的,他们试图为阅读交互式的输入而工作。你基本上结束了与终端和输入缓冲区的战斗。

在处理交互式会话的标准输入和解析-重新提示时,cin.clear()没有做任何合理的事情。你不应该这么叫。

用cin.getline()重写所有内容并解析产生的字符串,您将能够理解并修复这些失败模式。

票数 2
EN

Stack Overflow用户

发布于 2016-12-09 16:21:21

如果您的代码工作很好,如果您的main()如下所示:

代码语言:javascript
复制
int main() { detailLoop(); }

我怀疑您是从循环中调用detailLoop,这将导致无限循环。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41064334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档