从字符串中提取单词-棘手的问题

时间:2019-04-07 20:24:23

标签: c++ string word

在C ++中从字符串中提取单词时,我需要帮助。在我要完成的练习的定义中,一个单词是由字母和数字组成的任意序列,这些序列以非字母或数字的字符为边界(例如,插入点,空格等)。例如:

This.Is.a.String 

我的程序应该创建一个字符串向量,其中向量的元素将是提到的字符串中的单个单词,在这种情况下为“ This”,“ Is”,“ a”,“ String”。

我尝试使用for循环遍历给定的字符串,并检查一种条件,即只要我们现在使用的字符是IS(按ASCII值)就介于A和Z(a和z)以及数字0和9,将其放入字符串中。接下来,将该字符串放入向量中,并将字符串的大小调整为0(这样我们就可以输入另一个单词。)这似乎不起作用...

vector<string> Function(string s) {
    char letter;
    string r;
    vector<string> vector_string;
     for(int i=0; i<s.length(); i++) {
        letter=toupper(s.at(i));  // I do this so all letters are capital letters, so it's easier to compare them
        r.resize(0);
   while((letter>=65 || letter<=90) && (letter>=48 || letter<=57)) {

        r.push_back(s.at(i));

    }
        vector_string.push_back(r);




}

 return vector_string;
  }

P.S。我是C ++的新手。我知道这离解决方案不远,但是我必须从某个地方开始。如果您能在此做什么帮助我,我将不胜感激!有点令人沮丧。

谢谢您,抽出宝贵的时间!

1 个答案:

答案 0 :(得分:1)

您有一个无限的while循环。并且它的条件不正确。

这里有一个改进:

vector<string> split(string s) {
    char letter;
    vector<string> vector_string;

    for(int i=0; i<s.length(); ) {
        if (isalnum(s[i])) {
            string r; 
            do {  
               r.push_back(s[i++]);
            } while(i<s.length() && isalnum(s[i]));
            vector_string.push_back(r);
        }
        else i++; 
    }
    return vector_string;
}

Online demo

此修订版使用预定的isalnum()来获取单词中的字母数字字符。

为编写更清晰的条件,通常应首选在<cctype>或更佳的locale-aware counterparts中使用标准的字符分类谓词。

编辑:如果可以使用正则表达式?

不确定您是否被允许,但是代码如下所示:

vector<string> split(string s) {
    regex word_definition("([a-zA-Z0-9]+)");
    auto words_begin = sregex_iterator(s.begin(), s.end(), word_definition);
    auto words_end = sregex_iterator();

    vector<string> vector_string;
    for(auto i = words_begin; i!=words_end; i++) {
        vector_string.push_back(i->str());
    }
    return vector_string;
}