字符串文字的意外 strlen 结果

Nin*_*750 -2 c++ string strlen

#include <iostream>
#include <cstring>

int main()
{   
    auto l = std::strlen("123\0456\0");
    std::cout << l << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

为什么这段代码的输出是5?

我预计 3。

这是要测试的在线版本:https : //ideone.com/UQRKlV

Bat*_*eba 8

"123\0456\0"是类型的文字const char[7]

\045是单个字符,以八进制指定。在 ASCII 中它是'%'. 这里\0表示NUL由于最大适合解析规则提取\045作为八进制转义序列:请注意,0,4,和5是有效的八进制数字以及一个八进制转义序列不能超过3个位数更长。

第二个\0是显式的NUL,并且NUL在文字的末尾有一个隐含的额外内容。

strlen将返回 5 因为在第一个之前有那么多字符NUL

  • @NathanPierson:八进制转义序列最多为三位数字。 (2认同)