2012-02-25 53 views
0

我想使用空格作为分隔符来解析字符串。我知道它可以使用来自字符串库assignsubstringfind的3种方法完成。基本上我想将我的目标字符串从字符串的开始处分配给第一次出现的空白字符串。使用assign,substring和find方法解析空白字符串

这将是这样的

while(!line.empty()) 
{ 

    line.assign(line.substr(0, line.find(" ") 
    line.erase(0, line.find(" "); 

} 

我的问题是,这会不会去了解解析字符串的好办法?

+0

除非我读这个错误,你可能要添加一个额外的')'或两个每个那些'line.'。但是,这可以通过使用甚至是两个std::string成员来完成线。 :) – summea 2012-02-25 06:21:21

+1

这是在这里严重的评论:http://stackoverflow.com/questions/53849/how-do-i-tokenize-a-string-in-c – Timeout 2012-02-25 06:21:53

回答

2

您需要多一点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"));