当string包含特殊字符时,C ++ substr()出现问题

时间:2010-12-12 14:26:51

标签: c++ string substring

我正在尝试将c ++字符串拆分为多个子字符串(NUM_LINES),每个子字符串的长度为CHAR_PER_LINE。

 for(int i = 0; i < NUM_LINES; i++) {
 lines[i] = totalstring.substr(i*CHAR_PER_LINE,CHAR_PER_LINE);
 }

只要字符串中没有特殊字符,就可以正常工作。否则substr()会得到一个长度不是CHAR_PER_LINE字符的字符串,但会在特殊字符之前停止并退出循环。

任何提示?


好的,编辑: 1)我绝对没有达到我的字符串的末尾。如果我的totalstring.length()是1000并且我在第一行中有一个特殊字符(这是字符串的第一个CHAR_PER_LINE(30)字符),则循环退出。

2)我遇到问题的特殊字符例如是'ö'和' - '(长篇)

编辑2:

std::string text = "aaaabbbbccccdödd";
std::string line[4];

for(int i = 0; i < 4; i++) 
    line[i] = text.substr(i*4,4);


for(int i = 0; i < 4; i++)
    std::cout << line[i] << "\n";

此示例有效。我得到了'%'。 所以问题不在于substr()。抱歉。我正在使用Cairo来创建一个gui,而我的开罗输出似乎导致了麻烦,而不是substr()。

3 个答案:

答案 0 :(得分:1)

您正在谈论的特殊字符的暗示怎么样?

我的猜测是你到达了字符串的末尾。

答案 1 :(得分:1)

STL不关心特殊字符。如果存在多字节序列(即UTF8),则std::string将它们视为单个一字节字符的序列。如果您需要正确的Unicode处理,请不要使用内置substrlength

然而,您可以使用std::wstring(从您的帖子中不清楚您是否已经使用它,但我猜不是) - 它包含wchar_t个字符 - 足够大您的目标平台的原生字符集。

答案 2 :(得分:0)

发生的事情是你在最后一行的字符串末尾运行。跳过字符后,它不会退出循环。它应该正确地退出循环,并且最后一行包含正确数量的字符,只是它们中的一些是垃圾,所以你的诊断打印输出显示该行很短。

循环可以提前退出的唯一方法是抛出异常。