在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::istringstream
和std::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
..