判断转义十六进制在字符串中的结尾位置

Ale*_*lex 3 c c++ windows

printf我想用函数打印 10\xc2\xb0Celsius

\n\n

通常我会这样做:

\n\n
printf("10\\xF8Celsius");\n
Run Code Online (Sandbox Code Playgroud)\n\n

其中 \\xF8 是度数符号的 ANSI 代码。问题是编译器获取 \\x 之后的所有十六进制字符并尝试转换为字符,基本上它获取\\F8Ce并尝试将其转换为字符。

\n\n

我可以这样写:

\n\n
printf("10\\xF8 Celsius"); //see additional space\n
Run Code Online (Sandbox Code Playgroud)\n\n

但问题仍然存在。

\n\n

如何告诉编译器我的十六进制代码在哪里结束?是否可以?

\n\n

注意:我在 Windows 8.1 上使用 Visual Studio 2015 PRE 来观察这个问题(并不是说这个问题是特定于平台的,只是提一下)

\n

Art*_*tur 5

十六进制转义序列没有字符限制,因此 - 由于解析器是贪婪的 - 它会抓取它可以获得的所有十六进制数字。C 规范摘录:

hexadecimal-escape-sequence:
    \x hexadecimal-digit
    hexadecimal-escape-sequence hexadecimal-digit

hexadecimal-digit: one of
    0 1 2 3 4 5 6 7 8 9
    a b c d e f
    A B C D E F
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题 - 将您的字符串分成两个连续的字符串,然后将它们连接起来(在翻译阶段#6;-)。所以而不是:

printf("10\xF8Celsius");
Run Code Online (Sandbox Code Playgroud)

使用:

printf("10\xF8" "Celsius");
Run Code Online (Sandbox Code Playgroud)