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

Opu*_*pux 2 c printf

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

char sTemp[100];
sprintf(sTemp, "%%%02x", (unsigned)c);
Run Code Online (Sandbox Code Playgroud)

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

0x0.000000000000ap-1022

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

Rus*_*ove 6

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

sprintf()当c 为时,该调用的结果'\n'是这个字符串:

"%0A"

我相信你当时在做:

printf(sTemp);
Run Code Online (Sandbox Code Playgroud)

这与以下相同:

printf("%0a");
Run Code Online (Sandbox Code Playgroud)

这是十六进制浮点输出的有效格式字符串.但是,您没有传递一个float变量,因此printf()请将附近的堆栈中的任何内容拉出来并将其用作格式化值.

相反,做:

printf( "%s", sTemp );
Run Code Online (Sandbox Code Playgroud)

你应该看到你期望的"%0a".

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

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

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