您需要多一点line
变量:因为如果字符串包含非空格字符,您的代码将不会终止。当然,这假定它首先编译,因为有许多括号和分号丢失(另外,你的问题与你的代码不匹配:没有函数substring
;如果你想有效编程,你有要非常精确的关于的一切:电脑把你的说法写得很直白)。你可能想把你的line
切成小块并放入某种容器中。
一旦在这些琐碎的方面,你可能要考虑使用' '
代替" "
,因为在这种情况下,编译器和库可以假设你想寻找一个字符,而不是字符序列。这可以更快一点。但是,这实际上不是空格而只是空间。空格还包括'\t'
(制表符),'\r'
(回车),'\n'
(换行符),(垂直制表符),'\b'
(退格)和'\f'
(换页)等多个特殊字符。说到速度,你可能不希望从字符串的开头输入erase()
位,因为这产生了O(n * n)算法,而这可以通过例如O(n)来完成。通过保持一个变量的位置。这也避免了两次搜索的问题,这是不必要的昂贵。如果存在两个相邻的字符串,您还应该考虑行为:应该在您的序列中产生一个空字符串,还是应该将它视为有一个空格(在这种情况下,您可能也想使用first_not_of()
)。
其实,我只是重读问题陈述:如果你只是想提取字符串到第一个空间,你不需要erase()
,empty()
,或循环,如果你坚持要用assign()
。 find()
和erase()
:
line.erase(line.find(" \t\r\n\v\b\f"));
除非我读这个错误,你可能要添加一个额外的')'或两个每个那些'line.'。但是,这可以通过使用甚至是两个
std::string
成员来完成线。 :) – summea 2012-02-25 06:21:21这是在这里严重的评论:http://stackoverflow.com/questions/53849/how-do-i-tokenize-a-string-in-c – Timeout 2012-02-25 06:21:53