4

假设 stringstream contains James is 4,我可以写一些类似getline (stream, stringjames, ' ')的东西来获取单个单词,但是有没有办法知道我已经到了行尾?

奖金问题!案例一:James is 4 案例二:James is four

如果我正在遍历字符串流中的单词,并且我希望收到一个 4 的 int val,但我收到了一个字符串,那么最好的检查方法是什么?

4

2 回答 2

6

您检查返回值以查看它的计算结果是 true 还是 false:

if (getline(stream, stringjames, ' '))
    // do stuff
else
    // fail

至于“奖金问题”,您也可以在int从流中提取 s 和事物时做同样的事情。的返回值operator>>将评估true读取是否成功,以及false是否有错误(例如有字母而不是数字):

int intval;

if (stream >> intval)
    // int read, process
else if (stream.eof())
    // end-of-stream reached
else
    // int failed to read but there is still stuff left in the stream
于 2012-09-25T01:01:43.697 回答
1

假设 stringstream 包含 James is 4 ,我可以写一些类似 getline (stream, stringjames, ' ') 的东西来获取单个单词,但是有没有办法知道我已经到了行尾?

通常最容易读入std::string变量 - 默认情况下无论如何都认为它由空格分隔:

std::string word;
while (some_stream >> word)
{
    // first iteration "James", then "is", then "4", then breaks from while...
}

奖金问题!案例 1:詹姆斯 4 岁 案例 2:詹姆斯 4 岁

如果我正在遍历字符串流中的单词,并且我希望收到一个 4 的 int val,但我收到了一个字符串,那么最好的检查方法是什么?

您最好string先将其读入,然后检查是否可以将其string转换为数字。您可以尝试strtoi strtol等等 - 它们有助于指示整个值是否是合法数字,因此您可以检测和拒绝诸如“4q”之类的值。

另一种方法是先尝试流式传输到整数类型,并且只有在它失败时才重置流上的错误标志并改为获取字符串。我不记得您是否需要重新定位流以便读取字符串变量,但您可以编写几个测试用例并将其弄清楚。

或者,您可以使用正则表达式和子表达式匹配来解析您的输入:当表达式变得更复杂时更有用。

于 2012-09-25T01:21:38.837 回答