我想用printf
函数打印10摄氏度
通常我会这样做:
printf("10\xF8Celsius");
其中\ xF8是度号的ANSI代码。 问题是编译器在\ x之后采用所有的hex字符并尝试转换为一个字符,基本上它需要\F8Ce
并尝试将其转换为一个字符。
我可以这样写:
printf("10\xF8 Celsius"); //see additional space
但问题依然存在。
如何告诉编译器我的hex代码结束? 可能吗?
注意:我在Windows 8.1上使用了Visual Studio 2015 PRE来观察这个问题(不是说这个问题是特定于平台的,而只是提到它)
从这个C ++转义序列参考 :
十六进制转义序列没有长度限制,并且在不是有效的十六进制数字的第一个字符处终止。
所以没有任何解决方法,编译器将读取的数字没有限制。
请注意, 相应的C引用也是一样的。
十六进制转义序列没有字符限制,因为解析器是贪婪的,它抓取所有十六进制数字。 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 abcdef ABCDEF
为了弥补这一点 – 将您的字符串分成2个连续的,他们将被加入(在翻译阶段#6 ;-))。 所以,而不是:
printf("10\xF8Celsius");
使用:
printf("10\xF8" "Celsius");
正确的解决方法是按照预期使用printf函数。 请查阅printf-documentation。
printf("10%c Celsius", 0xF8)
您可以使用八进制转义序列而不是十六进制转义序列。 例如
printf("10\370Celsius");
从C ++标准(2.14.3字符文字)
4 escape \ ooo由反斜杠和一个,两个或三个八进制数字组成,用于指定所需字符的值….
从C11规格6.4.4.4字符常量
十六进制转义序列:
\ x十六进制数字
十六进制转义序列十六进制数字
示例3即使八位用于具有char类型的对象,由于十六进制转义序列仅由非十六进制字符终止,所以构造'\ x123'指定仅包含一个字符的整数字符常量。 要指定包含两个字符的值为'\ x12'和'3'的整数字符常量,可以使用构造'\ 0223',因为八进制转义序列在三个八进制数字之后终止。 (这个双字符整数字符常量的值是实现定义的。)
所以解析器会尝试解析尽可能多的十六进制字符。
一种解决方法是使用字符串连接:
printf("10\xF8" "Celsius");
现场示例
要么
printf("10%cCelsius", '\xF8');
或者使用保证不超过3个字符长的等价的八进制转义序列。
注:使用'\xF8'
进行打印不是可移植的,可能无法在许多平台上使用。 您可以使用unicode字符串文字作为便携式代码。