1

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

例子:

输入:abc def ghi

向量: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;
}
4

1 回答 1

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

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

要进行的更改:

vector<string> dane;

然后删除

const char* c = s.c_str();

然后将下一行更改为

dane.push_back(s);

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

于 2013-05-11T07:47:40.097 回答