【问题标题】:C++ substring seems to be pointing at wrong spotC++ 子字符串似乎指向错误的位置
【发布时间】:2025-12-25 10:20:18
【问题描述】:

我正在使用 C++ 读取文本文件。 因为我是 C++ 新手,所以我添加了一堆“cout”语句来查看事情的表现。 我得到了一个我找不到解释的输出,希望这里有人可以指出一些相关的文本。

  1. 我读了一行
  2. 打印该行
  3. 使用“substr()”打印“line”中的前 2 个字符
  4. 将该行复制到工作区(“mybuffer”)
  5. 打印我的工作区的子字符串,长度为 10 个字符

问题: (a) (3) 的输出似乎是一个转义序列(不可打印的字符)。如果我将子字符串的长度从 2 更改为 4,我会得到一个 /。 (b) 即使“mybuffer”的内容看起来正确(前两个字符确实是 //),子字符串函数只返回七个(可打印)字符。

while( std::getline( file, line ) )
{
foundeq = 0;
clearthis = 0;
mybuffer = line;
cout<< "line>>" << line<<"\n";
cout<<"first 2 chars in line>>"<<line.substr(0,2)<<"\n";
cout<< "mybuffer>>" << mybuffer<<"\n";
cout<<"first 10 chars in mybuffer>>"<<mybuffer.substr(0,10)<<"\n";

输出:

    line>>//--------------------------------------------------
    first 2 chars in line>>\357\273
    mybuffer>>//--------------------------------------------------
    first 10 chars in mybuffer>>//-----

发生了什么事??

提前感谢您的 cmets。

【问题讨论】:

    标签: c++ string substr


    【解决方案1】:

    简答

    您的文件以UTF-8 编码,开头有一个Byte Order Mark

    答案稍长

    因此,您的控制台正在为您打印八进制的前两个数字。 0357 和 0273。UTF-8 BOM 的第三个字符是 0277。大概当您控制台看到这三个字符连续时,它决定不打印它们。

    此外,您文件中的第 4 个字符可能是一个适合一个字节的 /

    【讨论】:

    • 我猜到了很多,感谢您的澄清。一个问题仍然存在:为什么这些字符包含在子字符串中? (PS 我还不允许投票,否则我会。)
    • 它们是文件的前三个字节。 std::string 并不是真正理解字符串,它只是一系列字节。
    • 隐藏奇怪(读取非 ascii)字符的工具很常见。因此,根据您使用的编辑器,您看不到前 3 个字符,即使它们在那里。 \357 \273 \2770xEF 0xBB 0xBF 的八进制表示形式,它们确实是文件中的前 3 个字符,即使您看不到它们。
    • @Kyle:更可能的是,nandomtl 的编辑器了解 UFT-8 BOM,将这些字符解析为 BOM,然后将文件的其余部分解析为 UTF-8。
    • @Bill 我明白了。这些字符在文件中(感谢 BOM 链接 - 我最近确实在文本文件中看到了 )。唯一有点不寻常的是,当(且仅当)可打印字符在流中时,控制台会忽略这些字符。谢谢你,比尔! 2015 年快乐!