如何将带有转义字符的 C/C++ 字符串转换为普通(原始)字符串

Chr*_*ard 1 c c++ escaping character

函数原型将是:

string f (string s);
Run Code Online (Sandbox Code Playgroud)

或者

char* f (char* s);
Run Code Online (Sandbox Code Playgroud)

f 会将可打印的 ascii 字符表示的字符串转换为原始字符串。

它的行为与以下示例相同:

f("AAA") = "AAA"
f("AA\n") = "AA+line_feed"
Run Code Online (Sandbox Code Playgroud)

即输入字符串是 4 个字符长 (+ NULL),输出是 3 个字符长 (+NULL)。2 个可打印字符 '\' 'n'(输入字符串的最后 2 个字符)被一个 LF 字符(ascii 10)替换

f("\0x007") 返回包含字符 ascii 7 的长度为 1 的字符串

f("AA\nAA\tAA\07\n") 会将所有这些转义字符转换为它们的真实(每个转义序列 1 个字符)等价物。

这必须存在,至少 C 编译器/C 预处理器会这样做。

/C

Cli*_*ord 5

我认为您完全误解了转义序列的工作原理。例如,“AA\n”不是您建议的“ 4 个字符长(+ NULL) ”,它实际上正是您想要的 - 一个三个字符的字符串。编译器为您提供翻译,它不会在运行时发生。

要确认这是真的,请尝试以下操作:

printf( "%d\n", strlen( "AA\n" ) ) ;
Run Code Online (Sandbox Code Playgroud)

您将观察到输出为 3。

现在,如果您在运行时有一个包含转义序列的字符串;例如文字字符串“AA\n”,它四个字符,那么标准库没有理由仅仅因为编译器执行你认为的这样的翻译就提供这个功能。编译器功能在运行时不可用。

自己实现这样的转换是微不足道的,例如,您可以在遇到 '\' 时简单地扫描字符串,您将使用下一个字符作为 switch 构造的控制变量来选择要插入到输出字符串中的字符。如果遇到 \x 或 \0,则需要读取后续的十六进制或八进制数字以确定要插入的字符。