从字符串中提取单词

Posted

技术标签:

【中文标题】从字符串中提取单词【英文标题】:Extract a Word from a String 【发布时间】:2016-07-02 05:11:49 【问题描述】:

我正在处理家庭作业,但我似乎无法正确使用此功能。有没有人知道为什么这不能创建一个由两个空格(单词 0、单词 1 等)之间的字符组成的子字符串?

string extractWord(string s, int wordNum)

    int wordIndices[10];
    int i = 0;
    for (int z = 0; z < s.length(); z++)
    
        if (isspace(s.at(z))==true)
        
            wordIndices[i] = z;
            i++;
        
    
    return s.substr(wordIndices[wordNum], abs(wordIndices[wordNum+1] - wordIndices[wordNum]));

【问题讨论】:

如果s"word1 word2",那么,wordIndices[0] 将是5。我不认为你想要那个。换句话说,如果没有前导空白字符,wordIndices[0] 必须设置为0 顺便说一句,你可以把std::string当作一个数组,不需要at函数,比如s[z] 【参考方案1】:

最简单的方法是使用std::istringstream

std::string extractWord(std::string s, int wordNum)

     std::istringstream iss(s);
     std::string word;
     std::vector<std::string> words;
     while(iss >> word) 
         words.push_back(word);
     
     return words[wordnum];

注意wordnum 超出范围时引发的异常。

【讨论】:

我已经知道了,你会来这里说 “我的任务限制我使用等等等等”,尽管这在使用 c++ 进行实际编程中并不重要.【参考方案2】:

在这种情况下,在 for 循环之前,您应该尝试添加以下 if 语句:

if (! isspace(s.at(0))

  wordIndices[i] = 0;
  i++;

您面临的问题是如果 wordNum 为 1 并且没有前导空格,则 wordIndices[0] 设置为第一个空格,这与您的代码不兼容。 此外,在 for 循环之后,您应该输入:

wordIndices[i] = s.length()

在提取最后一个单词时,wordIndices[wordNum+1] 有一个垃圾值。

【讨论】:

以上是关于从字符串中提取单词的主要内容,如果未能解决你的问题,请参考以下文章

从字符串中提取单词 - 微妙的问题

从字符串中提取单词

如何从重复的字符串中提取单词

从python中的字符串中提取英文单词

从字符串中提取单词并将它们移动到数组中

使用python regex从字符串中提取单词