使用cin进行整数输入时捕获字符串

eat*_*hil 2 c++ cin

我在google/stackoverflow上看过类似的帖子.但是,我找不到一个足够接近我的场景的人,我不太了解C/C++,以便将其他建议移植到我的方法中.也许这是一个标志,它本身......

无论如何,这是我的代码:

while (true)
{
    print("\nSend message, enter command, or \"9\" for help.\n");

    if (cin >> input)
    {
        if (input == TERMINAL_HELP)
        {
            //Some help code.
        }
        else if (input == TERMINAL_EXIT)
        {
            //Some exit code.
        }
        else if (input < 4 && input >= 0)
        {
            // Some processing code.
        }
        else
        {
            print("Please enter a valid message.");
        }
    }
    else
    {
        print("Please enter a valid message.");
    }
}
Run Code Online (Sandbox Code Playgroud)

捕获对于范围[0-4]范围之外的单个字符或整数可以正常工作.但是当我把一根绳子放进去时,它变得非常奇怪.它不断地循环自己.但是在第一次之后这应该是不可能的,因为我没有按回车键.它继续,好像它无限地接收一个空白.

如果您有任何建议或可以指出我解决问题的方向,我会很感激!谢谢!

注意:

我试图遵循这个,它在某种程度上起作用.(我从这个链接中得到了if语句中的cin >>输入...)但它不能阻止字符串使程序循环变得奇怪.

使用cin-C++的良好输入验证循环

que*_*atl 5

只是为了让你开始......

关键点:

  • iostreams(包括cin)有一些叫做"错误标志"的东西
  • 发生错误时,可以将流配置为*)引发异常*)跳过下一个操作
  • 默认配置是..不抛出并跳过进一步的操作

这意味着,如果您这样做:

cin >> integer1;
cin >> integer2; // *!
cin >> integer3; // !
cin >> integer4; // !
Run Code Online (Sandbox Code Playgroud)

如果用户在标有(*)的行上提供非整数,那么此时cin将进入错误状态,并且将跳过标有(!)的操作.

很可能这就是为什么你会得到像无限读取循环等奇怪的行为.

要处理这个:

  • 或者配置流以抛出异常 - 并捕获它们
  • 或者在每次读取后检查错误状态 - 并处理它们

cin >> integer1; if(cin.fail()) { cout << "wtf?!"; cin.clear(); .. return; }
cin >> integer2; if(cin.fail()) { cout << "wtf?!"; cin.clear(); .. return; }
cin >> integer3; if(cin.fail()) { cout << "wtf?!"; cin.clear(); .. return; }
cin >> integer4; if(cin.fail()) { cout << "wtf?!"; cin.clear(); .. return; }
Run Code Online (Sandbox Code Playgroud)

cin.reset清除错误标志并允许对流进行进一步操作.但是,所有垃圾数据仍将留在流中.因此,尝试进一步阅读是没有意义的.在cin.reset之后你应该以某种方式删除那些坏数据并从这种情况中恢复.我用".."标记了这些地方,因为有很多方法可以做到.

例如,cin.ignore ..

现在请参考所有其他帖子:)我相信你现在可以快速找到解决方案

编辑:aargh ..对不起,我离实际答案太远了.你真正想要的不是一个好的错误处理,而是类似于sehe写的东西:而不是读整数,你应该读一个"字符串"然后检查它,然后将它们重新解析为整数或视为字符串数据.