Yoa*_*osh 3 c++ string static-variables pass-by-reference
可能重复:
在C++中拆分字符串
我试图创建一个模仿函数行为的getline()函数,可以选择使用分隔符将字符串拆分为标记.该函数接受2个字符串(第二个是通过引用传递)和一个char分隔符的类型.它遍历第一个字符串的每个字符,将其复制到第二个字符串,并在到达分隔符时停止循环.true如果第一个字符串在分隔符后面有更多字符,则返回,false否则返回.最后一个字符的位置保存在静态变量中.由于某种原因,程序进入无限循环并且没有执行任何操作:
const int LINE_SIZE = 160;
bool strSplit(string sFirst, string & sLast, char cDelim) {
static int iCount = 0;
for(int i = iCount; i < LINE_SIZE; i++) {
if(sFirst[i] != cDelim)
sLast[i-iCount] = sFirst[i];
else {
iCount = i+1;
return true;
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
该功能以下列方式使用:
while(strSplit(sLine, sToken, '|')) {
cout << sToken << endl;
}
Run Code Online (Sandbox Code Playgroud)
为什么它会进入一个无限循环,为什么它不起作用?我应该补充说istringstream,如果可能的话,我对没有使用的解决方案感兴趣.
这不正是你要的是什么,但你有没有考虑std::istringstream和std::getline?
// UNTESTED
std::istringstream iss(sLine);
while(std::getline(iss, sToken, '|')) {
std::cout << sToken << "\n";
}
Run Code Online (Sandbox Code Playgroud)
编辑:
为什么它会进入一个无限循环,为什么它不起作用?
我们无法知道,您没有提供足够的信息.尝试创建一个SSCCE并发布它.
我可以告诉你,以下行非常可疑:
sLast[i-iCount] = sFirst[i];
Run Code Online (Sandbox Code Playgroud)
在以下任何条件下,此行都将导致未定义的行为(可能包括您所看到的行为):
i >= sFirst.size()i-iCount >= sLast.size()i-iCount < 0在我看来,所有这些条件都是正确的.例如,如果传入的字符串短于160行,或者如果iCount增长到大于第一个分隔符的偏移量,那么您将获得未定义的行为.