【问题标题】:C++ split string to vector<string>C++ 将字符串拆分为向量<string>
【发布时间】:2017-05-03 04:42:38
【问题描述】:

我使用的功能是

vector<string> tokenise(string s){

}

首先,我打算将字符串拆分为子字符串,在这种情况下,字符串始终是算术表达式(例如“100+5”)并且可能会有一些空格。

需要“100+5”才能转换成“100”、“+”、“5”

转换后,子字符串将存储在向量中并返回。我正在努力迈出第一步并使用下标循环字符串。返回值的类型是char,所以没办法放到vector中。

【问题讨论】:

  • 您可以使用std::string str(1, ch);char转换为字符串
  • 如果只使用一个字符的字符串,不妨使用char
  • @InternetAussie 正如我所问,我必须使用字符串,这让我别无选择。
  • @AjayBrahmakshatriya 你能在实际代码中进一步解释吗?
  • 如果是这样,为什么不返回std::vector&lt;char&gt;

标签: c++


【解决方案1】:

在确定数字、算术字符或不需要的字符范围之后,您可以调用字符串的substring 方法。

【讨论】:

  • 它对我不起作用,因为区分数字和运算符的字符串范围是不确定的。
【解决方案2】:

你提到了——返回值的类型是char,所以没办法放到vector中。

你有一些函数可以返回一个字符。然后你想将等价的字符串插入向量中。

假设你的向量被定义为

std::vector<std::string> broken_strings;

所以你可以这样做。

char ch = ...; // Here comes the character that you get from the function.
std::string str(1, ch);
broken_strings.push_back(str);

然后你可以返回broken_strings。

编辑:

OP 提到他想标记代数表达式。 所以它必须以不同的方式完成。

以下是一种简单的方法。

 std::vector<std::string> broken;
 std::string temp;
 for ( int i = 0; i<s.length() ;i++){
     char ch = s[i];
     if (ch == ' ')
         continue;
     else if (ch >= '0' && ch <='9')
         temp += ch;
     else{
         if (temp.length() != 0)
             broken.push_back(temp);
         temp = "";
         temp += ch;
         broken.push_back(temp);
         temp = "";
     }
 } 
 if (temp.length() != 0)
     broken.push_back(token);
 return broken; 

你可以在这里看到同样的演示

Ideone

【讨论】:

  • 那个,或者string::substr
  • 你已经完全改变了你的问题。现在您需要一些逻辑来识别令牌的结束位置。您可能想查看 lex 或 flex 之类的词法分析工具。
  • 对不起,有什么简单的方法可以解决这个问题。
  • 假设你有一组可以作为操作符的字符,就可以做到。我将编辑我的答案以做同样的事情。
  • 你在哪里声明“s”
【解决方案3】:
vector<string> tokenise(string s)
{
    vector<string> v;

    string number;

    for(int i = 0; i < s.length(); ++i)
    {
        if((s[i] >= '0') && (s[i] <= '9'))
        {
            number += string(1, s[i]);
        }
        else if(s[i] == '.')
        {
            number += string(1, s[i]);
        }
        else if((s[i] == '+') || (s[i] == '-') || (s[i] == '*') || (s[i] == '/'))
        {
            if(number.size())
            {
                v.push_back(number);
                number.clear();
            }
            v.push_back(string(1, c));
        }
    }

    if(number.size())
    {
        v.push_back(number);
        number.clear();
    }

    return v;
}

【讨论】:

  • 我喜欢你的解决方案,和我的想法几乎一样
猜你喜欢
  • 2014-01-16
  • 2020-11-08
  • 1970-01-01
  • 2014-09-16
  • 1970-01-01
  • 1970-01-01
  • 2020-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多