这个“#”在这里做了什么

时间:2013-07-10 19:10:11

标签: c format-specifiers

我想出了一个代码

#include <stdio.h>

int main()
{ 
   int i = 1427;
   double d = 1427.0;

   printf("%#o\n", i);
   printf("%#X\n", i);
   printf("\n%g\n", d);
   printf("%#g\n", d);
   return 0;
}

给出输出:

02623
0X593

1427
1427.00

首先我认为#用于为输出加前缀0,但我错了,因为它在上一次输出中的奇怪行为,它在十进制后打印零。 有人可以解释这个#是什么以及它在这里做了什么?

5 个答案:

答案 0 :(得分:8)

#标志具有不同的行为,具体取决于上下文。

如果它与oxX说明符一起使用,则值前面有00x或{{1分别。

如果它与0X / aA / eE / fF一起使用,值始终以小数点结束。

此行为在网络上的多个位置都有很好的记录。搜索“printf”和可能的“格式说明符”通常会产生很多好的链接。以下是一些可以满足您的胃口:

答案 1 :(得分:1)

来自POSIX手册页man 3p printf

  

#:指定将值转换为替代形式。对于o转换,它会增加强制的精度(如果需要)                 结果的第一个数字为零。对于x或X转换说明符,非零结果必须以0x(或0X)为前缀。为一个,                 A,e,E,f,F,g和G转换说明符,结果应始终包含基数字符,即使基数字符后面没有数字 -                 之三。如果没有此标志,只有在跟随数字后,才会在这些转换的结果中显示基数字符。用于g和G转换                 说明符,尾随零不应像通常那样从结果中删除。对于其他转换说明符,行为是                 未定义。

简单来说:它打印替代格式,无论它是什么。对于十六进制对于八进制0x,它为前缀0,对于浮点,它强制使用一些十进制规则...

答案 2 :(得分:1)

我认为如果您阅读有关C的printf函数here,您将能够进一步理解诸如“#”之类的内容。

  

与o,x或X说明符一起使用时,该值的前面是0,0x或0X   分别用于不同于零的值。与a,A,e,E,f一起使用,   F,g或G它强制写入的输出包含小数点   如果没有更多数字跟随。默认情况下,如果没有数字,则不包含小数   这是写的。

答案 3 :(得分:1)

wikipedia开始:

  

#替代表格。对于'g'和'G',不删除尾随零。对于'f','F','e','E','g','G',输出始终包含小数点。对于'o','x'和'X',分别为0,0x和0X,前置为非零数字。

答案 4 :(得分:0)

%#o(八进制)0插入前缀。

%#x(十六进制)0x前缀添加到非零值。

%#X(十六进制)0X前缀添加到非零值。

%#g始终显示小数点尾随               零没有删除。

由于您使用的是%#g,因此必须在十进制之后出现零。