我正在尝试将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)我遇到问题的特殊字符例如是'ö'和' - '(长篇)
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()。
答案 0 :(得分:1)
您正在谈论的特殊字符的暗示怎么样?
我的猜测是你到达了字符串的末尾。
答案 1 :(得分:1)
STL不关心特殊字符。如果存在多字节序列(即UTF8),则std::string
将它们视为单个一字节字符的序列。如果您需要正确的Unicode处理,请不要使用内置substr
或length
。
然而,您可以使用std::wstring
(从您的帖子中不清楚您是否已经使用它,但我猜不是) - 它包含wchar_t
个字符 - 足够大您的目标平台的原生字符集。
答案 2 :(得分:0)
发生的事情是你在最后一行的字符串末尾运行。跳过字符后,它不会退出循环。它应该正确地退出循环,并且最后一行包含正确数量的字符,只是它们中的一些是垃圾,所以你的诊断打印输出显示该行很短。
循环可以提前退出的唯一方法是抛出异常。