使用assign、substring和find方法分析空白处的字符串

Parsing a string on whitespace with the assign, substring, and find methods

本文关键字:空白处 字符串 方法 find assign substring 使用      更新时间:2023-10-16

我想使用空白作为分隔符来解析字符串。我知道可以使用字符串库中的3种方法来完成,即assignsubstringfind。基本上,我想为我的目标字符串分配从字符串开头到第一次出现空白的子字符串。

它会像这个

while(!line.empty())
{
    line.assign(line.substr(0, line.find(" ")
    line.erase(0, line.find(" ");
}

我的问题是,这是解析字符串的好方法吗?

您需要的不仅仅是一个line变量:按原样,如果字符串包含非空格字符,您的代码将不会终止。当然,这假设它首先编译,因为缺少了许多括号和分号(此外,您的问题与代码不匹配:没有函数substring;如果您想有效地编程,您必须非常精确地了解所有:计算机会非常字面地对待您的语句)。你可能想把line切成小块,放进某种容器里。

一旦讨论了这些琐碎的方面,您可能需要考虑使用' '而不是" ",因为在这种情况下,编译器和库可以假设您只想查找一个字符,而不是一系列字符。这可以快一点。然而,这实际上不是空格,而是空格。空白还包括许多特殊字符,如't'(制表符)、'r'(回车)、'n'(换行符)、'v'(垂直制表符),'b'(退格)和'f'(表单提要)。说到速度,你可能不想从字符串的开头erase()位,因为这会产生一个O(n*n)算法,而这可以通过O(n)来实现,例如通过保持一个变量的位置。这也避免了搜索两次的问题,这是不必要的昂贵的。如果有两个相邻的字符串,您还应该考虑行为:这是否会在您的序列中产生一个空字符串,或者应该将其视为有一个空格(在这种情况下,您可能还想使用first_not_of())。

事实上,我只是重读了问题陈述:如果你只想提取到第一个空格的字符串,你不需要erase()empty(),如果你坚持使用assign(),也不需要循环。然而,这甚至可以使用两个std::string成员来完成:find()erase():

line.erase(line.find(" trnvbf"));