在C++
中,如果标准输入流cin
的输入值与变量类型不匹配,则可以计算为false
(通过隐式布尔转换)将要存储。
例如,
#include <iostream>
using namespace std;
int main() {
int x;
while (cin >> x)
{
cout << "valid integer input\n";
}
cout << "invalid integer input !!\n";
return 0;
}
输入/输出上述代码,
输入
12
13
15
ABC
输出
valid integer input
valid integer input
valid integer input
invalid integer input !!
这是我的问题,
如预期的那样,如果在上述情况下我们提供了非数字输入,则cin
的计算结果为false,程序在那里结束。但是,如果我在上面的代码中使用string
变量代替整数变量,那么我可以提供什么可能的输入值,以便cin
评估为false
呢?因为当我在上面的代码中尝试使用string
变量而不是int时,while循环似乎永远不会结束...
答案 0 :(得分:1)
表达式cin >> x
返回cin
,因此您检查cin
的布尔值。
iostream的operator bool定义为:
检查流是否没有错误。
...
2.如果流没有错误并且可以进行I / O操作,则返回true。具体来说,返回!fail()
。使用该运算符可以使用返回对流的引用作为循环条件的流和函数,从而导致惯用的C ++输入循环,例如
while(stream >> value) {...}
或while(getline(stream, string)){...}
。仅当输入操作成功时,此类循环才会执行循环的主体。
在int
的情况下,ABC
失败,因为ABC
无法转换为int。 cin
评估为false的另一种情况是输入流关闭时。
答案 1 :(得分:0)
我已经意识到,有时在字符串输入循环(如while循环)中,“文件结尾”仍会被识别为字符串输入,而不是信号指示数据输入结束的命令。因此,我通常使用if-else手动将字符串“文件结尾”(或基本上所有内容)设置为数据输入的结尾。例如,对于字符串大小写,我将像这样重写您的代码(int大小写将类似):
#include <iostream>
using namespace std;
int main() {
string s;
string eof("end-of-file");
while (cin >> s) {
if (s != eof) { // the "!=" operator means "different from"
cout << "valid-string-input" << endl;
} else {
return 0;
}
}
cout << "invalid string input" << endl;
return 0;
}
注意:您应该意识到,尽管int不能是字符串,但字符串几乎可以是任何东西,即使数字表示“ 10”或“ 1”仍可以视为有效的字符串输入,只是这些“ 10“或” 1“不是整数,因此无法执行算术运算。因此,与int情况相比,此处的“无效字符串输入”可能会更难触发。
返回0的简短说明,这基本上意味着该程序将被识别为成功并将在此处结束。因此,else {return 0;}表示如果字符串是“文件末尾”,则程序将仅在此处停止并被识别为已成功运行/运行。