我想用printf
功能
通常我会这样做:
printf("10\xF8Celsius");
其中\ xF8是度数符号的ANSI代码。问题是编译器在\ x之后取所有十六进制字符并尝试转换为字符,基本上它需要\F8Ce
并尝试将其转换为字符。
我可以这样写:
printf("10\xF8 Celsius"); //see additional space
但问题仍然存在。
如何告诉编译器我的十六进制代码在哪里结束?有可能吗?
注意:我在Windows 8.1上使用Visual Studio 2015 PRE来观察此问题(并非此问题是特定于平台的,只是提及它)
答案 0 :(得分:3)
十六进制转义序列没有字符限制所以 - 因为解析器是贪婪的 - 它抓取它可以获得的所有十六进制数字。 C spec excerpt:
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
要解决这个问题 - 将你的字符串分成2个连续,然后加入(在翻译阶段#6 ;-)。所以而不是:
printf("10\xF8Celsius");
使用:
printf("10\xF8" "Celsius");
答案 1 :(得分:2)
来自this C++ escape sequence reference:
十六进制转义序列没有长度限制,并在第一个不是有效十六进制数字的字符处终止。
因此,没有任何变通方法,编译器将读取的数字没有限制。
请注意,corresponding C reference说的是同样的事情。
答案 2 :(得分:2)
正确的解决方法是按预期使用printf函数。请查看printf-documentation。
printf("10%c Celsius", 0xF8)
答案 3 :(得分:1)
来自C11规格 6.4.4.4字符常量
十六进制转义序列:
\X 十六进制数字
十六进制转义序列 十六进制数字
示例3即使八位用于char类型的对象, 构造'\ x123'指定整数字符常量 只包含一个字符,因为十六进制转义序列是 仅由非十六进制字符终止。 指定整数 包含值为的两个字符的字符常量 '\ x12'和'3',可以使用构造'\ 0223',因为是八进制 转义序列在三个八进制数字后终止。(值的 这个两个字符的整数字符常量是 实现定义的。)
因此,解析器将尝试解析尽可能多的十六进制字符。
一种解决方法是使用字符串连接:
printf("10\xF8" "Celsius");
或
printf("10%cCelsius", '\xF8');
或者使用等效的八进制转义序列,保证长度不超过3个字符。
注意:使用'\xF8'
进行打印是不可移植的,可能无法在许多平台上运行。您可以将unicode字符串文字用于可移植代码。
答案 4 :(得分:1)
您可以使用八进制转义序列而不是十六进制转义序列号。例如
printf("10\370Celsius");
来自C ++标准(2.14.3字符文字)
4 escape \ ooo由反斜杠后跟一,二或者组成 三个八进制数字,用于指定所需的值 字符....