【问题标题】:Validation of whitepsace separated integers c++验证whitepsace分隔的整数c ++
【发布时间】:2017-01-01 07:03:39
【问题描述】:

我在 SO 上看到了有关验证输入格式的其他问题,但是我正在为我遇到的问题寻找更具体的答案。

目前,我需要读取 2 个整数值并将它们存储为坐标。我用过:

cin >> x >> y

这将读取由空格分隔的 x 和 y 的值。

但是,除了 a 之外的任何输入

int whitepsaceint

会破坏我的程序。我试图验证输入以确保每个值都是整数,但它仅适用于第一个整数输入。

我还需要确保输入的格式保持为 int whitespace int,以便我可以在整个程序中始终如一地使用这些值。

有什么想法吗?

我尝试过但没有运气的事情:

  • 使用带有cin.fail()max() 检查的do - while 循环读取。
  • 使用isDigit() 进行验证

【问题讨论】:

  • 请澄清是否总是在第二个整数之后的行尾; “输入的格式仍然为int whitespace int”到底是什么意思?您的意思是要保留输入文件中两个整数之间发生的确切空格吗?另外,当输入与期望不匹配时,您希望发生什么?

标签: c++ validation input integer cin


【解决方案1】:

先将这两个值读入两个std::strings。这将读取任何以空格分隔的文本,而不会将 std::cin 置于失败状态。

读入这两个单词后,为每个单词构造一个std::istringstream,使用operator>> 尝试将其解析为int。使用fail()检查转换是否失败,以及是否消耗了整个std::istringstream

如果std::istringstream 不处于失败状态,并且get() 返回eof,则整个单词成功解析为int

问题解决了。

当然,这不是唯一的方法,但可能是最简单的方法,而且方法仅限于使用基本的 C++ 库类,没什么花哨的。

【讨论】:

  • 我打算提出一个问题 - 但我自己设法解决了这个问题。谢谢你。真的很感激!
  • 这是极少数情况之一,我有时会使用 FILE * 恢复到好的 ol' scanf 系列函数,并且不要为此感到难过。
  • @JasonC cin >> x >> yscanf("%d %d", &x, &y) 在错误处理要求上非常相似
  • @M.M 对fail() 的单独检查让我很沮丧。但就像你说的,这只是一个很小的区别。它只是以错误的方式摩擦我,没有真正的原因。我确实喜欢 scanf("%d %d", &x, &y) 告诉你哪个失败了。
猜你喜欢
  • 2014-01-21
  • 2011-09-27
  • 1970-01-01
  • 2012-11-02
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多