2

我正在尝试重复读取整数,对于不是整数的标记,将它们作为字符串读取和处理。我认为以下方法会起作用:

string s;
int x;

while(1) {
    if (cin >> x)                                     // try reading as int
        cout << "read int: " << x << endl;
    else {                                            // try reading as string
        cin.clear();

        if (cin >> s) 
            cout << "read string: " << s << endl;
        else
            break;                                    // eof
    }
}

但是,对于输入(末尾有换行符)

1 2 a

它给出了输出

read int: 1
read int: 2

好像清除流之后的状态和之前不完全一样,实际上cin >> s失败了。为什么会这样,我怎样才能实现我想要的行为?

澄清一下,我无法将字符串解析为 int,因为我还没有“学习”到这一点。

4

2 回答 2

5

clear不倒带流;顾名思义,它只清除错误标志。要解决您的问题,请将输入读取为字符串,然后尝试将其解析为 int。该链接比我更好地解释了 string-int 转换的细节。

于 2013-07-06T01:48:42.560 回答
2

为什么不将其读取为字符串,然后尝试转换,因此如果转换失败,您可以将其视为字符串。

在 C++11 中有std::stoi. 如果找不到转换,它将引发异常。

另一种方法是将其作为字符串读入,然后使用字符串流进行解析。

如果您不能使用现有的字符串解析方法,为什么不自己编写呢?

// Returns false if not an int, otherwise true and outint will hold the correct value.
bool strtoint(const std::string str, int *outint) {
    int val = 0;
    for (int x = str.length() - 1; x >= 0; x--) {
        if (!(str[x] <= '9' && str[x] >= '0') || !(str[x] == '-')) {
            return false;
        } else if (str[x] == '-') {
            val *= -1;
        } else {
            val += (int)((str[x] - '0') * pow(10, (str.length() - 1) - x));
        }
    }

    *outint = val;
    return true;
}

或者类似的东西,我不确定逻辑是否完全正确,但我认为它在正确的轨道上。

于 2013-07-06T01:48:56.617 回答