这个输出的对应输入是什么?

What could be a corresponding input to this output?

考虑以下代码:

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'$ffq` ong string

可以输入什么?

所以我认为它应该是 %d%x 之类的。所以它执行: sprintf(j, "%x"); 但没有与此格式对应的变量。

  1. 这个函数在这种情况下是做什么的?好像是个地址
  2. 可以输入什么?是 %x 还是其他?

sprintf(j, k); 应该是 sprintf(j, "%s", k); - 请检查 sprintf 原型。

无法确定 ,但很明显 k 的输入本质上是 a[=25= 的某种形式] 格式说明符。它可以是众多中的 任何

在那之后,由于缺少该格式说明符的参数,sprintf() 正在调用未定义的行为,如 C11,章节 §7.21.6.1

中所述

[..] If there are insufficient arguments for the format, the behavior is undefined. [...]

为避免此类错误,请勿将用户输入作为格式字符串传递给 printf() 系列。使用更安全的来源,例如

  printf("fixed format string with format specifiers %s %d and all", arg1, arg2);