使用cin对象和清除缓冲区(c ++)进行输入验证

时间:2011-11-04 14:26:15

标签: c++ buffer inputstream cout cin

以前我是一名C程序员(想了解更多关于系统编程的信息,但不想进入汇编,所以我选择了C)更多,但后来在我的大学我必须学习C ++,我实际上很难使用cincout对象的时间与我在C中的受信任printf()scanf()getchar()宏相比有一些变化。这是代码。

守则

 int main(void)
 {
    using namespace std;

    cout << "What is the number?\n\n";
    cout << "#Number :";
    cin >> num;

    while(cin.fail())
    {
        cin.clear();
        cin.ignore(1000 , '\n');
        cout << "Please enter a number\n\n";
        cout << "#Number :";
        cin >> num;
    }

    return 0;
 }



问题

1.)我希望此代码向用户请求一个数字(小于和大于或等于0),当用户输入一个字符或字符串时,我希望它提醒用户有关它,清除输入缓冲区并重新启动用户一个新值,直到它是一个数字。

2.)所以我只是谷歌搜索并找到一个宣讲该方法的页面,所以我只是按照方式但它失败了。我不知道为什么一旦我运行这个代码,输入一个字符就会导致输出Please enter a number的无限循环。我在这段代码中做错了什么?

感谢您花时间阅读我的问题

P / S:我正在使用CodeBlocks和minGW编译器。

2 个答案:

答案 0 :(得分:2)

你没有说它失败了,所以很难说出你的问题 是。您从未声明num这一事实是一个明显的问题。和 如果您输入的行长度超过1000个字符,则会失败。

C ++中更惯用的解决方案是使用std::getline逐行读取输入,然后使用std::istringstream将行转换为数字。

答案 1 :(得分:0)

使用格式输入的标准方法是对操作本身进行条件检查。此外,您将需要读取整行并尝试解析该行而不是通过令牌提取令牌。例如。像这样:

int num;

for (bool success = false; !success; )
{
  std::cout << "Please enter a number: ";

  std::string line;
  if (std::cin >> line)
  {
    std::istringstream iss(line);
    if (iss >> num) success = true;
  }

  if (!success) { std::cout << "Error!\n"; }
}

std::cout << "Thank you. You said: " << num << std::endl;

随意在错误分支中添加更多诊断输出。