请考虑以下代码:
void main()
{
int i = 0;
char j[22] = "This is a long string", k[3];
scanf("%2s", k);
sprintf(j, k);
for (; i < 21; printf("%c", j[i++]));
}
输出为:
U%ae&#39; $ ffq` ong string
可能是什么输入?
所以我认为应该是%d
或%x
。所以它执行:sprintf(j, "%x");
但是这个格式没有相应的变量。
%x
还是其他什么?答案 0 :(得分:1)
sprintf(j, k);
应为sprintf(j, "%s", k);
- 请检查sprintf
原型。
答案 1 :(得分:1)
无法告诉确定,但很明显k
的输入基本上是某种形式的格式说明符。它可以是中的任何。
之后,由于该格式说明符缺少参数,sprintf()
正在调用未定义的行为,如C11
中所述,章节§7.21.6.1
[..]如果格式的参数不足,则行为是 未定义。 [...]
要避免此类错误,请不要将用户输入作为格式字符串传递给printf()
系列。使用更安全的,比如
printf("fixed format string with format specifiers %s %d and all", arg1, arg2);