c ++按字符分割字符串?

时间:2013-12-24 05:05:21

标签: c++ arrays string split

如何通过“102:330:3133:76531:451:000:12:44412”字符拆分“:”之类的字符串,并将所有数字放入一个int数组中(数字序列始终为8长)使用外部库,如boost。

另外,我想知道如何在处理之前从字符串中删除不需要的字符,例如“$”和“#”?

9 个答案:

答案 0 :(得分:9)

stringstream可以完成所有这些。

  1. 拆分字符串并存储到int数组中:

    string str = "102:330:3133:76531:451:000:12:44412";
    std::replace(str.begin(), str.end(), ':', ' ');  // replace ':' by ' '
    
    vector<int> array;
    stringstream ss(str);
    int temp;
    while (ss >> temp)
        array.push_back(temp); // done! now array={102,330,3133,76531,451,000,12,44412}
    
  2. 在处理字符串之前删除不需要的字符,例如$#:就像上面处理:的方式一样。

答案 1 :(得分:8)

C中的标准方式是使用strtok,就像其他人已经回答的那样。但strtok不是C++ - 也不是unsafe。 C ++中的标准方法是使用std::istringstream

std::istringstream iss(str);
char c; // dummy character for the colon
int a[8];
iss >> a[0];
for (int i = 1; i < 8; i++)
    iss >> c >> a[i];

如果输入始终具有固定数量的令牌,sscanf可能是另一个简单的解决方案

std::sscanf(str, "%d:%d:%d:%d:%d:%d:%d:%d", &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8);

答案 2 :(得分:4)

之前我必须编写一些这样的代码,并在Stack Overflow上找到一个问题,用于通过分隔符拆分字符串。以下是原始问题:link

您可以将此项与std::stoi一起用于构建矢量。

std::vector<int> split(const std::string &s, char delim) {
    std::vector<int> elems;
    std::stringstream ss(s);
    std::string number;
    while(std::getline(ss, number, delim)) {
        elems.push_back(std::stoi(number));
    }
    return elems;
}

// use with:
const std::string numbers("102:330:3133:76531:451:000:12:44412");
std::vector<int> numbers = split(numbers, ':');

Here is a working ideone sample

答案 3 :(得分:1)

这是一种方式......不是最聪明但写得快的(8次重复即将完成保证循环)。这种解析方法非常有用,非常有用。 !(iss >> c)确保字符串中没有尾随的非空格字符。

std::istringstream iss(the_string);
char c;
int n[8];
if (iss >> n[0] >> c && c == ':' &&
    iss >> n[1] >> c && c == ':' &&
    iss >> n[2] >> c && c == ':' &&
    iss >> n[3] >> c && c == ':' &&
    iss >> n[4] >> c && c == ':' &&
    iss >> n[5] >> c && c == ':' &&
    iss >> n[6] >> c && c == ':' &&
    iss >> n[7] && !(iss >> c))
    ...

答案 4 :(得分:0)

您可以使用strtok()分割字符串,也许在while循环中。

当您获得单个字符串时,可以使用atoi(xxx)进行整数转换。

答案 5 :(得分:0)

真的!没有elven magic

它有点回答here

#include <cstring>
#include <iostream>
#include<cstdlib>
#include<vector>

int main() 
{
    char input[100] = "102:330:3133:76531:451:000:12:44412";
    char *token = std::strtok(input, ":");
    std::vector<int> v;

    while (token != NULL) {
        v.push_back( std::strtol( token, NULL, 10 ));
        token = std::strtok(NULL, ":");
    }

    for(std::size_t i =0 ; i < v.size() ; ++i)
        std::cout << v[i] <<std::endl;
}

演示Here

答案 6 :(得分:0)

包括

#include <string.h>

int main ()
{
  char str[] ="102:330:3133:76531:451:000:12:44412";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str,":");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, ":");
  }
  return 0;
}

答案 7 :(得分:0)

使用C ++ 11中的正则表达式功能的另一种解决方案。

#include <algorithm>
#include <iostream>
#include <iterator>
#include <ostream>
#include <regex>
#include <sstream>
#include <string>
#include <vector>

int main()
{
    const std::string s = "102:330:3133:76531:451:000:12:44412";

    // Replace each colon with a single space
    const std::regex pattern(":");
    const std::string r = std::regex_replace(s, pattern, " ");

    std::istringstream ist(r);

    std::vector<int> numbers;
    std::copy(std::istream_iterator<int>(ist), std::istream_iterator<int>(),
        std::back_inserter(numbers));

    // We now have a vector of numbers

    // Print it out
    for (auto n : numbers)
    {
        std::cout << n << " ";
    }
    std::cout << std::endl;

    return 0;
}

答案 8 :(得分:0)

要删除字符'#'和'$',您可以使用标准算法std::remove_if。但是请注意,如果有例如以下字符串“12#34”,则在删除“#”后,您将ge为“1234”。如果您需要,结果字符串将显示为“12 34”或“12:34”,而不是std::remove_if,最好使用std::replace_if

下面是一个执行任务的示例代码。您需要包含标题

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <algorithm>

int main()
{
    char s[] = "102:$$330:#3133:76531:451:000:$12:44412";

    std::cout << s << std::endl;

    char *p = std::remove_if( s, s + std::strlen( s ), 
        []( char c ) { return ( c == '$' || c == '#' ); } );
    *p = '\0';

    std::cout << s << std::endl;

    const size_t N = 8;
    int a[N];

    p = s;
    for ( size_t i = 0; i < N; i++ )
    {
        a[i] = strtol( p, &p, 10 );
        if ( *p == ':' ) ++p;
    }

    for ( int x : a ) std::cout << x << ' ';
    std::cout << std::endl;
}

输出

102:$$330:#3133:76531:451:000:$12:44412
102:330:3133:76531:451:000:12:44412
102 330 3133 76531 451 0 12 44412