【问题标题】:C++ substr() problems when string contains special characters字符串包含特殊字符时的 C++ substr() 问题
【发布时间】:2010-12-12 14:26:50
【问题描述】:

我正在尝试将 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,似乎是我的 Cairo 输出造成了麻烦,而不是 substr()。

【问题讨论】:

  • 请定义“特殊字符”
  • 编写一个我们可以测试的可编译程序。并在我们可以看到的地方发布输入和预期输出。最好输入小于 1000 个字符。

标签: c++ string substring


【解决方案1】:

提示一下你在说什么特殊字符怎么样?

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      发生的情况是您在最后一行的字符串末尾运行。跳过字符后它没有退出循环。它在应该退出循环的时候准确地退出了循环,最后一行包含正确数量的字符,只是其中一些是垃圾,所以您的诊断打印输出显示该行很短。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-25
        • 1970-01-01
        • 1970-01-01
        • 2020-07-12
        • 2014-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多