将字符串传递给printf的代码不能正常工作:
char p[50];
scanf("%s", p);
printf(p, 10);
输入:value:%d\n
预期输出:value:10
输出:value:10\n
而且,我在不同的时间得到了不同的输出。连续3次执行相同a.out的输出:
$./a.out
value: %d\n
value:
$./a.out
value:%d\n\n
value:10\n\n
$./a.out
value:%d\n
value:10\n
在上面的代码中,value: %d\n
是由scanf产生的,下一行是printf
发布于 2013-02-27 07:37:49
在将用户提供的文本作为第一个参数传递给printf
时要非常小心,否则将存在格式字符串漏洞。此外,通过使用纯scanf
,您还容易受到缓冲区溢出的攻击。(仅用了三行代码就有两个漏洞!)
也就是说,您在输出中获得文字\n
的原因是,当您在控制台输入\n
时,您将得到一个字符串,其中包含文字反斜杠,后跟n
,而不是换行符。
另外,请注意,scanf
会在任何空格处停止,因此输入value: xxx
将导致只有value:
进入缓冲区。如果你想读一整行,你应该使用像fgets
这样的函数。
发布于 2013-02-27 07:40:22
https://stackoverflow.com/questions/15106436
复制