假设stringstream包含James is 4
,我可以编写类似getline (stream, stringjames, ' ')
的内容来获取单个单词,但有没有办法知道我已经到达了行尾?
奖金问题!
案例1:James is 4
案例2:James is four
如果我正在迭代字符串流中的单词,并且我希望得到一个4的int值,但我收到了一个字符串,那么检查这个的最佳方法是什么?
答案 0 :(得分:6)
检查返回值以查看它是否为真或假:
if (getline(stream, stringjames, ' '))
// do stuff
else
// fail
至于“奖金问题”,从流中提取int
和事物时,你也可以做同样的事情。如果读取成功,operator>>
的返回值将评估为true
;如果出现错误(例如字母而不是数字),则false
的返回值将评估为:{/ p>
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
答案 1 :(得分:1)
假设stringstream包含James是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的int值,但我收到了一个字符串,那么检查这个的最佳方法是什么?
最好先将其读入string
,然后检查是否可以将string
转换为数字。您可以尝试strtoi
strtol
等 - 它们有助于指示整个值是否为合法数字,以便您可以检测并拒绝像“4q”这样的值。
另一种方法是首先尝试流式传输到整数类型,并且只有在它失败时才重置流上的错误标志并获取字符串。我不记得你是否需要重新定位流以便你可以读取字符串变量,但是你可以编写几个测试用例并将其搞定。
或者,您可以使用正则表达式和子表达式匹配来解析输入:当表达式变得更复杂时更有用。