在C++中创建一个字符串拆分函数

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,如果可能的话,我对没有使用的解决方案感兴趣.

Rob*_*obᵩ 5

这不正是你要的是什么,但你有没有考虑std::istringstreamstd::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增长到大于第一个分隔符的偏移量,那么您将获得未定义的行为.