C++ 拆分字符串函数给出意外输出
C++ split string function gives unexpected output
std::vector<char*> Split(std::string input) {
std::vector<char*> ret;
std::istringstream f(input);
std::string s;
while (getline(f, s, ' ')) {
ret.push_back((char*)s.c_str());
}
return ret;
}
这个函数的目的是获取一个字符串并将每个单词放入一个向量中。但是假设我把 ls -l
作为字符串。它应该 return 一个包含两个元素 ls
和 -l
的向量。相反,它 return 是一个包含两个元素 -l
和 l
的向量。谁能帮我解决这个问题?
您正在向量中存储指向字符串的指针,但字符串 s
在函数退出时被销毁。所以你正在存储指向已删除对象的指针。
使用字符串而不是指针。与指针不同,字符串很容易正确复制。试试这个
std::vector<std::string> Split(std::string input) {
std::vector<std::string> ret;
std::istringstream f(input);
std::string s;
while (getline(f, s, ' ')) {
ret.push_back(s);
}
return ret;
}
复制指针并不意味着复制指向的内容。
看来你必须复制字符串。
#include <cstring> // for strlen() and strcpy()
std::vector<char*> Split(std::string input) {
std::vector<char*> ret;
std::istringstream f(input);
std::string s;
while (getline(f, s, ' ')) {
char* buf = new char[strlen(s.c_str()) + 1]; // +1 for terminating null-character
strcpy(buf, s.c_str());
ret.push_back(buf);
}
return ret;
}
您从其他两个答案中得到了答案,但我有另一种拆分字符串的方法(称为 String Tokenization
):
std::vector<std::string> split(std::string text) {
std::vector<std::string> words;
std::string temp{};
for (int i=0; i < text.size(); ++i) {
if (text[i] != ' ') {
temp.push_back(text[i]);
if (i == text.size()-1) {
words.push_back(temp);
}
}
else if (temp.size() != 0) {
words.push_back(temp);
temp.clear();
}
}
return words;
}
std::vector<char*> Split(std::string input) {
std::vector<char*> ret;
std::istringstream f(input);
std::string s;
while (getline(f, s, ' ')) {
ret.push_back((char*)s.c_str());
}
return ret;
}
这个函数的目的是获取一个字符串并将每个单词放入一个向量中。但是假设我把 ls -l
作为字符串。它应该 return 一个包含两个元素 ls
和 -l
的向量。相反,它 return 是一个包含两个元素 -l
和 l
的向量。谁能帮我解决这个问题?
您正在向量中存储指向字符串的指针,但字符串 s
在函数退出时被销毁。所以你正在存储指向已删除对象的指针。
使用字符串而不是指针。与指针不同,字符串很容易正确复制。试试这个
std::vector<std::string> Split(std::string input) {
std::vector<std::string> ret;
std::istringstream f(input);
std::string s;
while (getline(f, s, ' ')) {
ret.push_back(s);
}
return ret;
}
复制指针并不意味着复制指向的内容。
看来你必须复制字符串。
#include <cstring> // for strlen() and strcpy()
std::vector<char*> Split(std::string input) {
std::vector<char*> ret;
std::istringstream f(input);
std::string s;
while (getline(f, s, ' ')) {
char* buf = new char[strlen(s.c_str()) + 1]; // +1 for terminating null-character
strcpy(buf, s.c_str());
ret.push_back(buf);
}
return ret;
}
您从其他两个答案中得到了答案,但我有另一种拆分字符串的方法(称为 String Tokenization
):
std::vector<std::string> split(std::string text) {
std::vector<std::string> words;
std::string temp{};
for (int i=0; i < text.size(); ++i) {
if (text[i] != ' ') {
temp.push_back(text[i]);
if (i == text.size()-1) {
words.push_back(temp);
}
}
else if (temp.size() != 0) {
words.push_back(temp);
temp.clear();
}
}
return words;
}