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

可能重复:
在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;
}

该功能以下列方式使用:

while(strSplit(sLine, sToken, '|')) {
    cout << sToken << endl;
}

为什么它会陷入无限循环,为什么它不起作用? 我应该补充说,如果可能的话,我对不使用istringstream的解决方案感兴趣。


这不完全是你要求的,但你有没有考虑过std::istringstreamstd::getline

// UNTESTED
std::istringstream iss(sLine);
while(std::getline(iss, sToken, '|')) {
  std::cout << sToken << "n";
}

编辑

为什么它会陷入无限循环,为什么它不起作用?

我们无法知道,您没有提供足够的信息。 尝试创建一个SSCCE并发布。

我可以告诉你,下面这行非常可疑:

       sLast[i-iCount] = sFirst[i];

在以下任何一种情况下,此行将导致未定义的行为(包括您可能看到的内容):

  • i >= sFirst.size()
  • i-iCount >= sLast.size()
  • i-iCount < 0
  • 在我看来,所有这些条件都是真实的。 例如,如果传入的字符串短于160行,或者iCount增长到大于第一个分隔符的偏移量,那么您将得到未定义的行为。


    LINE_SIZE可能大于string对象中的字符数,因此代码在字符串存储的末尾运行,几乎可能发生任何事情。

    而不是滚动自己的, string::find做你需要的。

    std::string::size_type pos = 0;
    std::string::size_type new_pos = sFirst.find('|', pos);
    

    find调用发现第一次出现'|' 那是'pos'位置或之后。 如果成功,则返回'|'的索引 它发现。 如果失败,则返回std::string::npos 。 在循环中使用它,每次匹配后,将[pos,new_pos]中的文本复制到目标字符串中,并将pos更新为new_pos + 1


    你确定它是不返回的strSplit()函数吗?或者它是你的调用者, while循环是无限的?

    你的呼叫者循环不应该是这样的:

    while(strSplit(sLine, sToken, '|')) {
        cout << sToken << endl;
        cin >> sLine >> endl;
    }
    

    - 编辑 -

    如果sLine值是这样,它使strSplit()返回true,那么while循环变成无限..所以做一些事情来改变sLine的值为循环的每个迭代..例如放入一个cin ..

    链接地址: http://www.djcxy.com/p/19579.html

    上一篇: creating a string split function in C++

    下一篇: Similar function to java's string.split(" ") in C++