Split string by a character?
True ! there's no elven magic
Its kinda answered here too
#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;
}
Demo Here
I had to write some code like this before and found a question on Stack Overflow for splitting a string by delimiter. Here's the original question: link.
You could use this with std::stoi
for building the vector.
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.
The standard way in C is to use strtok
like others have answered. However strtok
is not C++
-like and also unsafe. The standard way in C++ is to use 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];
In case the input always has a fixed number of tokens like that, sscanf
may be another simple solution
std::sscanf(str, "%d:%d:%d:%d:%d:%d:%d:%d", &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8);
stringstream
can do all these.
Split a string and store into int array:
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}
Remove unneeded characters from the string before it's processed such as
$
and#
: just as the way handling:
in the above.
PS: The above solution works only for strings that don't contain spaces. To handle strings with spaces, please refer to here based on std::string::find()
and std::string::substr()
.