【问题标题】:how to split a string on comma in C++ [duplicate]如何在C ++中用逗号分割字符串[重复]
【发布时间】:2013-02-11 22:01:58
【问题描述】:

我目前有这段代码,用户可以在其中输入一个数字来表示他们想要在数组中包含多少个数字。然后是“12345”,但是在写完它大约一秒钟后,我意识到这只有在他们输入数字 0-9 时才有效,任何两位数或更多的数字都不起作用。

int numberOfValues;
cout << "Please enter the amount of integers you want in the array" << endl;
cin >> numberOfValues;

int valuesArray[numberOfValues];
string valuesString;

cout << "Please Enter " << numberOfValues << " numbers" << endl;
cin>>valuesString;


for(int i = 0; i < numberOfValues; i++)
{
    valuesArray[i] = valuesString[i];
}
return valuesArray;

我认为最好的方法是让用户输入用逗号分隔的数字,然后将它们拆分(iv 在 java 中完成了同样的小 porgram,并尝试将其更改为 C++ 以供我自己学习) 就像在 java 中我使用了 string.split(",") 我想知道 c++ 中是否有类似的东西??

【问题讨论】:

  • 如果您愿意使用库,我认为boost::split 将是您首先要看的东西。这个问题证明了这一点,还有许多其他解决方案:stackoverflow.com/questions/236129/splitting-a-string-in-c
  • 谢谢,但我不想更多地使用外部库来学习一些核心内容是如何完成的,而不是仅仅使用一个库来为我做这件事,无论如何,我会看看其他一些方法这样做,但我正在寻找一种简单的好方法来做到这一点,因为我看到其中一些就像 80 行代码来拆分一个不能正确的字符串.. 对吗??
  • 此答案仅使用 C++ 标准库:stackoverflow.com/a/236803/78845

标签: c++ string split


【解决方案1】:

我能想到的最简单的方法是避免读取中间字符串并让 cin 为您完成工作:

std::vector<int> valuesArray;

int i = 0;
do {
    cin >> i;
    valuesArray.push_back(i);
} while (valuesArray.size() < numberOfValues && cin.get() == ',');

/* edit: You may need to consume a '\n', if you expect one, too: */
do {
    i = cin.get();
} while (i != '\n');

【讨论】:

  • 嘿,这种工作我返回了数组,然后随机打印了一些值,在 valuesArray[2] 之后,前几个值符合预期,它们都等于 0?不管应该有多少,而不是有什么想法?
  • valuesArray 声明为具有自动存储持续时间。当函数返回时,valuesArray 被销毁。因此,调用者将使用已销毁的数组。关注此空间;我将编辑以使用矢量。
  • 干杯现在试试看
  • 目前此代码在方法 int read(){} 中运行,但是如果我返回一个向量,我如何声明该方法,以便此向量 可返回和可用在主要方法中?
  • WOOT 终于让它工作了,再次感谢我给你最好的答案
【解决方案2】:

使用strtok。文档和示例可以在Here找到。

【讨论】:

    【解决方案3】:

    使用 string::substr() 和 string::find() 的组合。 查找下一个逗号字符,然后查找从当前位置到下一个命令字符的子字符串

    【讨论】:

      【解决方案4】:

      它不是标准的 C++ 字符串,但 Qt 的 QString 类仍然提供了一个现成的方法 QString::split(...),支持诸如正则表达式、拆分行为选项、区分大小写等等之类的东西...

      【讨论】:

        【解决方案5】:

        我前段时间写了一个分词器,希望它对你有用:

        std::vector<std::string> tokenize(const std::string &_line,const char *_delimeter)
        {
            std::vector<std::string> Tokens;
        
            if(_line.empty()) return Tokens;
        
            std::string str;
        
            BOOST_FOREACH(char c,_line){
                if(c==*_delimeter)
                {
                    Tokens.push_back(str);
                    str.clear();
                    continue;
                }
                str += c;
            }
        
            if(!str.empty())
                Tokens.push_back(str);
        
            return Tokens;
        }
        

        效率不高,但可用于测试目的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-10-25
          • 2016-03-21
          • 1970-01-01
          • 2020-08-30
          • 1970-01-01
          • 1970-01-01
          • 2015-05-31
          相关资源
          最近更新 更多