如何通过“102:330:3133:76531:451:000:12:44412
”字符拆分“:
”之类的字符串,并将所有数字放入一个int数组中(数字序列始终为8长)使用外部库,如boost。
另外,我想知道如何在处理之前从字符串中删除不需要的字符,例如“$”和“#”?
答案 0 :(得分:9)
stringstream
可以完成所有这些。
拆分字符串并存储到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}
在处理字符串之前删除不需要的字符,例如$
和#
:就像上面处理:
的方式一样。
答案 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, ':');
答案 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