C++ Strings Modifying and Extracting based on Separators

Kind of a basic question but I'm having troubles thinking of a solution so I need a push in the right direction.

I have an input file that I'm pulling in, and I have to put it into one string variable. The problem is I need to split this string up into different things. There will be 3 strings and 1 int. They are separated by a ":".

I know I can find the position of the first ":" by find(), but I really don't know how to progress through the string, for each thing and put it into it's own string / int.

The actual input from the file looks something like this:

A:PEP:909:Inventory Item

A is going to be command I have to execute... so that will be a string. PEP is a key, needs to be a string. 909 is an int.

and the last is a string.

So what I think I want to do is have 3 string var's, and 1 int and get all those things put into their respective variables.

So I think I'll end up wanting to conver this C++ string to a C string so I can use atoi to convert the one section to an int.


With C-style strings you can use strtok() to do this. You could also use sscanf()

But since you're dealing with C++, you probably want to stick with built in std::string functions. As such you can use find(). Find has a form which takes a second argument which is the offset to start searching. So you can do find( ':' ) to find the first instance, and then use find( ':', firstIndex+1 ) to find the next instances, where firstIndex is the value returned by the first call to find().


I usually use something like this:

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

you can use it like this:

std::vector<std::string> tokens;
split("this:is:a:test", ':', tokens);

tokens will now contain "this", "is", "a", and "test"


This is best done using std::getline and std::istringstream when you want to use the C++ Standard Library:

std::string command;
std::string key;
int         id;
std::string item;

std::string line = "A:PEP:909:Inventory Item";

// for each line: 
std::istringstream stream(line);

std::getline(stream, command, ':');
std::getline(stream, key, ':');
stream >> id;
std::getline(stream, item);

// now, process them

Consider putting it into an own struct:

struct record {
    std::string command;
    std::string key;
    int         id;
    std::string item;

    record(std::string const& line) {
        std::istringstream stream(line);
        stream >> *this;
    }

    friend std::istream& operator>>(std::istream& is, record & r){
        std::getline(is, r.command, ':');
        std::getline(is, r.key, ':');
        stream        >> r.id;
        std::getline(is, r.item);
        return is;
    }
};
链接地址: http://www.djcxy.com/p/19556.html

上一篇: C#将字符串拆分为另一个字符串

下一篇: 基于分隔符的C ++字符串修改和提取