【问题标题】:Break Cpp loop with "|"用“|”打破 Cpp 循环
【发布时间】:2013-08-03 03:58:46
【问题描述】:

我的代码读取不定数量的整数,一次读取两个:while (cin>>a>>b)

我希望在输入| 并将其分配给ab 时中断循环。

ab 都应声明为 int。然后我会比较:ab ==int('|')

最初将 'a' 和 'b' 定义为 chartype 可以让我避开这个问题,但并不理想。

这是 Stroustrup 的使用 C++ 的原则和实践(第 124 页)中的第 4 章练习。

我想我理解将 | 读入 int 变量试图将 string 转换为 int(不可接受?)。 Stroustrup 说在他的演练中使用这个角色来结束循环,但他没有解释他之前在书中提到它时是如何使用它的。实际上有没有一种方法可以根据需要使用| 字符,只使用本书中讨论的基本代码?非常感谢。

【问题讨论】:

  • 字符| 不是一个有效的整数,所以输入会失败并且你的循环会中断。但是,它不会分配给ab。如果要处理非整数文本,需要读入字符串或字符。
  • 不,| 根本不是int。 (也许有一个boost::glyph_cast 会返回1。我还没有调查过。)
  • 所以| 打算作为输入失败以打破循环?哈哈。好吧,尝试整天处理它很有趣。谢谢你们。

标签: c++ string types int type-conversion


【解决方案1】:

没有必要使用任何特定字符 - 任何非数字、非空白字符都会中断循环。

当执行cin >> a >> b 时,如您所知,它会按顺序将两个空格分隔的整数读入ab。表达式返回 cin 对象,因此整个表达式的值为cin。这一点很重要。

cin 在布尔上下文中求值时(例如在if 语句或while 循环中),它等效于调用!cin.fail()。也就是说,cin 将在流处于良好状态时评估为 true,但在出现错误时评估为 false

cin 尝试将| 字符读入int 变量时,该操作没有意义,因此会失败。 cin 然后设置它的失败标志。因为设置了失败标志,cin.fail() 将返回true,当cin 被评估为布尔值时,它评估为false,循环结束。

需要注意的是,cin进入fail状态后,需要重置其状态,并且cin之前丢弃的任何不可用的输入都可以再次使用:

cin.clear(); // reset state flags
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // discard all input up to next newline

【讨论】:

  • 感谢您的澄清。我很好奇,有没有办法在和ifswitch 语句中使用错误的cin 作为条件,所以我可以输出“循环中断”之类的东西?
  • @James:有if,是的。 switch 需要一个整数表达式 - 一个产生数字的表达式,而不是 bool。因此,具有两个可能值(0default)的 switch 对于 switch 并不是特别好的用途。
猜你喜欢
  • 1970-01-01
  • 2021-03-11
  • 2018-02-28
  • 2021-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多