当我输入一个字符时,while(cin >> value)打破了循环

时间:2019-04-07 19:02:09

标签: c++ c++11

过去,我一直在用c#编程,但是现在我正在学习c ++。为什么在我输入字符串时在c ++中退出while循环,而在我不使用tryparse的情况下在c#中退出则将给出异常。 C ++是否在后端中显式执行tryparse之类的操作? 对不起,如果我的问题 我正在使用代码块作为我的c ++ IDE。

我正在阅读c ++素数这本书,并编写一个简单的程序,该程序连续将整数作为输入,直到输入字符串为止。我在c#中编写了相同的代码,但它导致我出错。所以我必须在C#中使用tryparse方法。

int value = 0;

在C ++中

while( cin >> value );

在C#中

while( value  == int.parse(Console.ReadLine());

2 个答案:

答案 0 :(得分:1)

  

为什么在输入字符串时c ++中的while循环退出

operator>>在内部执行错误处理。如果未能提取整数,则流将进入失败状态,并且循环将检查流的状态,因此当流失败时将退出。

  

在c#中,如果我不使用tryparse,它将给出异常。

是的,因为这是int.parse()的定义工作方式。

您可以通过enabling exceptions in the stream在C ++中获得类似的行为。这样,如果发生提取失败,则会抛出std::ios_base::failure异常。

  

C ++是否在后端明确执行tryparse之类的事情?

从某种意义上说,是

  

我正在阅读c ++素数这本书,并编写一个简单的程序,该程序连续将整数作为输入,直到输入字符串为止。我用c#编写了相同的代码,但它导致我出错。

您的C ++和C#代码不相同。

您的C#代码按原样读取整行,放弃换行符,然后尝试将整行按原样转换为int。

您的C ++代码将丢弃前导空格-包括换行符-直到遇到非空格字符,然后尝试读取一个int值,并且其后的所有内容-包括换行符-都保留在流中以供后续读取

  

所以我必须在C#中使用tryparse方法。

如果您不希望转换失败而引发异常,那么可以。

答案 1 :(得分:0)

C ++知道要解析整数,因为您将变量“ value”定义为int类型。

来自C ++参考:

  

作为istream类的对象,可以将字符检索为   使用提取运算符(operator >>)或   未格式化的数据,使用诸如read之类的成员函数。