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