我以为我理解printf,但我猜不是.我有:
char sTemp[100];
sprintf(sTemp, "%%%02x", (unsigned)c);
Run Code Online (Sandbox Code Playgroud)
我认为c是一个未签名的字符,我认为是换行,但出于某种原因,我得出的是
0x0.000000000000ap-1022
如果我将格式字符串中的'x'设为'X',则输出字符串中会出现'X'.
我在这个答案的第一个版本中完全误解了我的实验结果; 道歉.
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]
正是因为这种事情:访问堆栈上的内存是不应该的.