解析以逗号分隔的std :: string [duplicate]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解析以逗号分隔的std :: string [duplicate]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

如果我有一个包含以逗号分隔的数字列表的std :: string,那么解析数字并将它们放在整数数组中的最简单方法是什么?

我不想将其概括为解析其他任何内容。只是一个逗号分隔整数的简单字符串,如“1,1,1,1,2,1,1,1,0”。

答案
#include <vector>
#include <string>
#include <sstream>
#include <iostream>

int main()
{
    std::string str = "1,2,3,4,5,6";
    std::vector<int> vect;

    std::stringstream ss(str);

    int i;

    while (ss >> i)
    {
        vect.push_back(i);

        if (ss.peek() == ',')
            ss.ignore();
    }

    for (i=0; i< vect.size(); i++)
        std::cout << vect.at(i)<<std::endl;
}
另一答案

我很惊讶没有人提出使用#include <sstream> #include <vector> const char *input = "1,1,1,1,2,1,1,1,0"; int main() { std::stringstream ss(input); std::vector<int> output; int i; while (ss >> i) { output.push_back(i); ss.ignore(1); } } 的解决方案:

std::regex

此函数将所有整数插入输入向量的后面。您可以调整正则表达式以包括负整数或浮点数等。

另一答案
#include <string>
#include <algorithm>
#include <vector>
#include <regex>

void parse_csint( const std::string& str, std::vector<int>& result ) {

    typedef std::regex_iterator<std::string::const_iterator> re_iterator;
    typedef re_iterator::value_type re_iterated;

    std::regex re("(\d+)");

    re_iterator rit( str.begin(), str.end(), re );
    re_iterator rend;

    std::transform( rit, rend, std::back_inserter(result), 
        []( const re_iterated& it ){ return std::stoi(it[1]); } );

}
另一答案

我还不能发表评论(在网站上开始),但在他的帖子中添加了一个更通用的版本的Jerry Coffin的奇妙的ctype派生类。

谢谢Jerry的超级想法。

(因为必须经过同行评审,暂时将其添加到此处)

string exp = "token1 token2 token3";
char delimiter = ' ';
vector<string> str;
string acc = "";
for(int i = 0; i < exp.size(); i++)
{
    if(exp[i] == delimiter)
    {
        str.push_back(acc);
        acc = "";
    }
    else
        acc += exp[i];
}
另一答案
struct SeparatorReader: std::ctype<char>
{
    template<typename T>
    SeparatorReader(const T &seps): std::ctype<char>(get_table(seps), true) {}

    template<typename T>
    std::ctype_base::mask const *get_table(const T &seps) {
        auto &&rc = new std::ctype_base::mask[std::ctype<char>::table_size]();
        for(auto &&sep: seps)
            rc[static_cast<unsigned char>(sep)] = std::ctype_base::space;
        return &rc[0];
    }
};
另一答案

结构简单,适应性强,维护方便。

bool GetList (const std::string& src, std::vector<int>& res)
  {
    using boost::lexical_cast;
    using boost::bad_lexical_cast;
    bool success = true;
    typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
    boost::char_separator<char> sepa(",");
    tokenizer tokens(src, sepa);
    for (tokenizer::iterator tok_iter = tokens.begin(); 
         tok_iter != tokens.end(); ++tok_iter) {
      try {
        res.push_back(lexical_cast<int>(*tok_iter));
      }
      catch (bad_lexical_cast &) {
        success = false;
      }
    }
    return success;
  }

最后,你将得到一个字符串向量,句子中的每个元素用空格分隔。空字符串保存为单独的项目。

另一答案

简单的复制/粘贴功能,基于std::string stringIn = "my,csv,,is 10233478,separated,by commas"; std::vector<std::string> commaSeparated(1); int commaCounter = 0; for (int i=0; i<stringIn.size(); i++) { if (stringIn[i] == ",") { commaSeparated.push_back(""); commaCounter++; } else { commaSeparated.at(commaCounter) += stringIn[i]; } }

boost tokenizer
另一答案

这是最简单的方法,我经常使用它。它适用于任何单字符分隔符。

void strToIntArray(std::string string, int* array, int array_len) {
  boost::tokenizer<> tok(string);
  int i = 0;
  for(boost::tokenizer<>::iterator beg=tok.begin(); beg!=tok.end();++beg){
    if(i < array_len)
      array[i] = atoi(beg->c_str());
    i++;
}
另一答案
#include<bits/stdc++.h>
using namespace std;

int main() {
   string str;

   cin >> str;
   int temp;
   vector<int> result;
   char ch;
   stringstream ss(str);

   do
   {
       ss>>temp;
       result.push_back(temp);
   }while(ss>>ch);

   for(int i=0 ; i < result.size() ; i++)
       cout<<result[i]<<endl;

   return 0;
}
另一答案
void ExplodeString( const std::string& string, const char separator, std::list<int>& result ) {
    if( string.size() ) {
        std::string::const_iterator last = string.begin();
        for( std::string::const_iterator i=string.begin(); i!=string.end(); ++i ) {
            if( *i == separator ) {
                const std::string str(last,i);
                int id = atoi(str.c_str());
                result.push_back(id);
                last = i;
                ++ last;
            }
        }
        if( last != string.end() ) result.push_back( atoi(&*last) );
    }
}
另一答案

一些不那么冗长,std并用逗号分隔的东西。

stringstream ss( "1,1,1,1, or something else ,1,1,1,0" );
vector<string> result;

while( ss.good() )
{
    string substr;
    getline( ss, substr, ',' );
    result.push_back( substr );
}
另一答案

另一种相当不同的方法:使用将逗号视为空格的特殊区域设置:

#include <locale>
#include <vector>

struct csv_reader: std::ctype<char> {
    csv_reader(): std::ctype<char>(get_table()) {}
    static std::ctype_base::mask const* get_table() {
        static std::vector<std::ctype_base::mask> rc(table_size, std::ctype_base::mask());

        rc[','] = std::ctype_base::space;
        rc['
'] = std::ctype_base::space;
        rc[' '] = std::ctype_base::space;
        return &rc[0];
    }
}; 

要使用此功能,您需要使用包含此构面的区域设置来对齐qzxswpoi。完成后,您可以读取数字,就好像逗号根本不存在一样。例如,我们将从输入中读取逗号分隔的数字,然后在标准输出上逐行写出:

imbue()
另一答案

#include <algorithm> #include <iterator> #include <iostream> int main() { std::cin.imbue(std::locale(std::locale(), new csv_reader())); std::copy(std::istream_iterator<int>(std::cin), std::istream_iterator<int>(), std::ostream_iterator<int>(std::cout, " ")); return 0; } 解决您的问题:

C++ String Toolkit Library (Strtk)

更多例子可以找到#include <string> #include <deque> #include <vector> #include "strtk.hpp" int main() { std::string int_string = "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15"; std::vector<int> int_list; strtk::parse(int_string,",",int_list); std::string double_string = "123.456|789.012|345.678|901.234|567.890"; std::deque<double> double_list; strtk::parse(double_string,"|",double_list); return 0; }

另一答案

使用通用算法和Here的替代解决方案:

Boost.Tokenizer
另一答案

您还可以使用以下功能。

struct ToInt
{
    int oper

以上是关于解析以逗号分隔的std :: string [duplicate]的主要内容,如果未能解决你的问题,请参考以下文章

java如何解析excel一个单元格中逗号分隔的数据

String_Split 使用 SQL 以逗号分隔列

将 ArrayList 数据转换为以逗号分隔的指定 String[]? [复制]

字符串 CSV解析 表格 逗号分隔值

如何使用 STRING_AGG() 以升序分隔字符串逗号

c ++在std :: vector中存储逗号分隔的最快方法是啥