将输入char *拆分为向量

时间:2013-05-11 07:41:41

标签: c++ vector split

我创建了将char*拆分为vector的函数,但问题是在运行此方法后,此vector的所有元素都是输入行中的最后一个元素。

示例:

输入:abc def ghi

vector:ghi, ghi, ghi

vector <const char*> dane;
void split(char* str, char* sep){
    char* cstr = str;//str.c_str konwersja str na char*
    char* current;
    current = strtok(cstr, sep);
    string s;
    while(current != NULL){
        s = current;
        int foundF = s.find_first_not_of("-.\"-\\/!,`");
        int foundL =  s.find_last_not_of("-.\"-\\/!,`");
        if(foundL==string::npos)//find first or last zwrocilo nulla
            foundL = s.length();
        if(foundF==string::npos)
            foundF = 0;
        s = s.substr(foundF, foundL + 1);
        const char* c = s.c_str();
        dane.push_back(c);
        current=strtok(NULL, sep);
    }
}

int main(){
    char* c = new char[256];
    cin.getline(c,256);
    cout<<c<<endl;
    split(c, " ");
    for(int i  = 0; i < dane.size(); i++){
        cout<<dane.at(i)<<endl;
    }
    return 0;
}

1 个答案:

答案 0 :(得分:3)

const char* c = s.c_str();
dane.push_back(c);

当然,这可能会导致你得到的东西,因为s.c_str()总是可以指向同一个位置。就我而言,这仅仅依赖于std::string的实现 - 你正在存储并使用C const char指针string::c_str()在特定字符串实例失效后返回(结果)赋值运算符) - 我相信你的程序会调用未定义的行为。

要做出的更改:

vector<string> dane;

然后删除

const char* c = s.c_str();

然后将下一行更改为

dane.push_back(s);

现在您将拥有子串的副本(而不是悬挂指向它们的指针),这将输出正确的结果。