是否存在某些输入条件,其“ cin >> someStringValue”可以评估为“ false”?

时间:2019-12-22 16:10:12

标签: c++ c++11 cin

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循环似乎永远不会结束...

2 个答案:

答案 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;}表示如果字符串是“文件末尾”,则程序将仅在此处停止并被识别为已成功运行/运行。