假设 stringstream contains James is 4
,我可以写一些类似getline (stream, stringjames, ' ')
的东西来获取单个单词,但是有没有办法知道我已经到了行尾?
奖金问题!案例一:James is 4
案例二:James is four
如果我正在遍历字符串流中的单词,并且我希望收到一个 4 的 int val,但我收到了一个字符串,那么最好的检查方法是什么?
假设 stringstream contains James is 4
,我可以写一些类似getline (stream, stringjames, ' ')
的东西来获取单个单词,但是有没有办法知道我已经到了行尾?
奖金问题!案例一:James is 4
案例二:James is four
如果我正在遍历字符串流中的单词,并且我希望收到一个 4 的 int val,但我收到了一个字符串,那么最好的检查方法是什么?
您检查返回值以查看它的计算结果是 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
假设 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”之类的值。
另一种方法是先尝试流式传输到整数类型,并且只有在它失败时才重置流上的错误标志并改为获取字符串。我不记得您是否需要重新定位流以便读取字符串变量,但您可以编写几个测试用例并将其弄清楚。
或者,您可以使用正则表达式和子表达式匹配来解析您的输入:当表达式变得更复杂时更有用。