我创建了将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;
}
答案 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);
现在您将拥有子串的副本(而不是悬挂指向它们的指针),这将输出正确的结果。