#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
std::vector<std::string> spiltStringBySemicilon(std::string str) {
std::vector<std::string> eles;
while (int pos = str.find(";") != std::string::npos) {
std::string eleStr = str.substr(0, pos);
str = str.substr(pos + 1);
eles.push_back(eleStr);
}
return eles;
}
int main() {
std::string content = "11;22;3;4;5;";
std::vector<std::string> eles = spiltStringBySemicilon(content);
for (auto ele : eles) {
std::cout << ele << std::endl;
}
}
乍一看,没有什么问题的。while循环内部,每次获取字符串中;
的位置,然后进行切割。
结果却与预期不符
1
;
2
3
4
5
经过定位发现第8行出现错误,pos赋值出现了问题。
int pos = str.find(";") != std::string::npos;
在上面的代码中,先执行的为str.find(";") != std::string::npos
, str中有;
则结果为true,pos=1
, 就出现了上述的结果。
真正的做法是pos在while循环外进行声明,且优先执行pos=str.find(";")
int pos = 0;
while((pos = str.find(";")) != std::string::npos) {
xxxx
}
正确的代码如下
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
std::vector<std::string> spiltStringBySemicilon(std::string str) {
std::vector<std::string> eles;
int pos = 0;
while ((pos = str.find(";")) != std::string::npos) {
std::string eleStr = str.substr(0, pos);
str = str.substr(pos + 1);
eles.push_back(eleStr);
}
return eles;
}
int main() {
std::string content = "111;22;3;4;5;";
std::vector<std::string> eles = spiltStringBySemicilon(content);
for (auto ele : eles) {
std::cout << ele << std::endl;
}
}
111
22
3
4
5