这个输出的对应输入是什么?
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");
但没有与此格式对应的变量。
- 这个函数在这种情况下是做什么的?好像是个地址
- 可以输入什么?是
%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);
考虑以下代码:
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");
但没有与此格式对应的变量。
- 这个函数在这种情况下是做什么的?好像是个地址
- 可以输入什么?是
%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);