Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 告诉转义的十六进制以字符串结尾的位置_C++_C_Windows - Fatal编程技术网

C++ 告诉转义的十六进制以字符串结尾的位置

C++ 告诉转义的十六进制以字符串结尾的位置,c++,c,windows,C++,C,Windows,我想用printf功能打印10摄氏度 通常我会这样做: printf("10\xF8Celsius"); 其中\xF8是学位标志的ANSI代码。问题是,编译器使用\x之后的所有十六进制字符并尝试转换为字符,基本上它使用\F8Ce并尝试将其转换为字符 我可以这样写: printf("10\xF8 Celsius"); //see additional space 但问题仍然存在 如何告诉编译器我的十六进制代码在哪里结束?可能吗 注意:我在Windows 8.1上使用Visual Studio

我想用
printf
功能打印10摄氏度

通常我会这样做:

printf("10\xF8Celsius");
其中\xF8是学位标志的ANSI代码。问题是,编译器使用\x之后的所有十六进制字符并尝试转换为字符,基本上它使用
\F8Ce
并尝试将其转换为字符

我可以这样写:

printf("10\xF8 Celsius"); //see additional space
但问题仍然存在

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


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

来自C11规范6.4.4.4字符常量

十六进制转义序列:
\x 十六进制数字
十六进制转义序列 十六进制数字

示例3即使8位用于具有char类型的对象, 构造“\x123”指定一个整数字符常量 只包含一个字符,因为十六进制转义序列是 仅由非十六进制字符终止指定一个整数 字符常量,包含两个字符,其值为 “\x12”和“3”,可以使用结构“\0223”,因为八进制 转义序列在三个八进制数字后终止。(的值 此两个字符的整数字符常量为 已定义实现。)

所以解析器将尝试解析尽可能多的十六进制字符

一种解决方法是使用字符串连接:

printf("10\xF8" "Celsius");

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



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

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

printf("10\370Celsius");
<>从C++标准(2.143字符文字)

4转义\ooo由反斜杠后跟一、二或三个字符组成 三个八进制数字,用于指定所需的 人物

发件人:

十六进制转义序列没有长度限制,并在不是有效十六进制数字的第一个字符处终止

因此,如果没有任何解决方法,编译器将读取的数字就没有限制


请注意,说明了相同的内容。

正确的修复方法是按预期使用printf函数。请查阅printf文档

printf("10%c Celsius", 0xF8)

十六进制转义序列并没有字符限制,所以——因为解析器是贪婪的——它会获取它能得到的所有十六进制数字。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
要纠正这种情况,请将字符串拆分为两个连续的字符串,然后将它们连接起来(在翻译阶段#6;-)。因此,不是:

printf("10\xF8Celsius");
使用:


尝试printf(“10%c摄氏度”,0xF8)在格式字符串中插入
°
:D只是kidding@DlanodKcud当这起作用时,别忘了感谢变量参数上的默认提升规则。很酷的解决方案。不知道您可以将2个字符串文本放入
printf
函数中……您可以将它们放在任何需要的地方。即使在编译器开始处理相邻字符串之前,它们也会(由预处理器)连接成一个字符串。编译器将获得一个字符串,并且甚至不知道在它只接收一个字符串的地方可能有更多的字符串。Printf将获得一个字符串(精确地说是指向字符串的指针)作为参数,而不是两个字符串。
printf("10\xF8Celsius");
printf("10\xF8" "Celsius");