告诉转义十六进制在字符串

时间:2015-07-06 07:01:25

标签: c++ c windows

我想用printf功能

打印10摄氏度

通常我会这样做:

printf("10\xF8Celsius");

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

我可以这样写:

printf("10\xF8 Celsius"); //see additional space

但问题仍然存在。

如何告诉编译器我的十六进制代码在哪里结束?有可能吗?

注意:我在Windows 8.1上使用Visual Studio 2015 PRE来观察此问题(并非此问题是特定于平台的,只是提及它)

5 个答案:

答案 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");

Live example

printf("10%cCelsius", '\xF8');

或者使用等效的八进制转义序列,保证长度不超过3个字符。

注意:使用'\xF8'进行打印是不可移植的,可能无法在许多平台上运行。您可以将unicode字符串文字用于可移植代码。

答案 4 :(得分:1)

您可以使用八进制转义序列而不是十六进制转义序列号。例如

printf("10\370Celsius");

来自C ++标准(2.14.3字符文字)

  

4 escape \ ooo由反斜杠后跟一,二或者组成   三个八进制数字,用于指定所需的值   字符....