sprintf:打印百分比,然后是0填充十六进制

时间:2014-07-23 16:02:47

标签: c printf

我以为我理解printf,但我猜不是。我有:

char sTemp[100];
sprintf(sTemp, "%%%02x", (unsigned)c);

我认为c是一个未签名的字符,我认为是换行符,但出于某种原因,我得出的是

  

0x0.000000000000ap-1022

如果我将格式字符串中的'x'设为'X',则输出字符串中会出现'X'。

1 个答案:

答案 0 :(得分:6)

我在这个答案的第一个版本中完全误解了我的实验结果;道歉。

当c为sprintf()'\n'调用的结果是此字符串:

  

“%0A”

我相信你正在做的事情:

printf(sTemp);

与以下内容相同:

printf("%0a");

这是十六进制浮点输出的有效格式字符串。但是,您没有传递一个float变量,因此printf()会拉出附近堆栈上发生的任何事情并将其用作要格式化的值。

相反,请执行:

printf( "%s", sTemp );

你应该看到你期望的“%0a”。

请注意,当您使用printf(sTemp)时,clang和其他编译器可能会发出警告:

  

so.c:9:12:警告:格式字符串不是字符串文字(可能   不安全的)[-Wformat-security]

正是因为这种事情:访问堆栈上的内存是不应该的。