How can I split a string such as "102:330:3133:76531:451:000:12:44412
by the ":"
character, and put all of the numbers into an int array (number sequence will always be 8 elements long)? Preferably without using an external library such as boost.
Also, I'm wondering how I can remove unneeded characters from the string before it's processed such as "$" and "#"?
First, define a string. Next, create a for-loop where the loop variable will start from index 0 and end at the length of the given string. Print the character present at every index in order to separate each individual character. For better visualization, separate each individual character by space.
Python split() method is used to split the string into chunks, and it accepts one argument called separator. A separator can be any character or a symbol. If no separators are defined, then it will split the given string and whitespace will be used by default.
To find the duplicate character from the string, we count the occurrence of each character in the string. If count is greater than 1, it implies that a character has a duplicate entry in the string. In above example, the characters highlighted in green are duplicate characters.
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()
.
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);
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With