0

将字符串传递给 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

4

2 回答 2

4

将用户提供的文本作为第一个参数传递给 时要非常printf小心,否则您将遇到格式字符串漏洞。此外,通过使用 bare scanf,您也容易受到缓冲区溢出的影响。(仅三行代码中的两个漏洞!)

也就是说,您\n在输出中获得文字的原因是,当您\n在控制台输入时,您会得到一个带有文字反斜杠的字符串,后跟一个n,而不是换行符。

另外,请注意,它会在任何scanf空白处停止,因此输入只会导致进入缓冲区。如果你想读一整行,你应该使用类似的函数。value: xxxvalue:fgets

于 2013-02-27T07:37:48.930 回答
0

您的代码的行为完全符合预期。在您的第一个示例中,您在“10”之前传递了空格,因此它没有被打印出来。

最简单的解决方法是使用 fgets() 而不是 scanf():

#include <stdlib.h>
#include <stdio.h>

void main () {
  char p[50];
  fgets(p, 50, stdin);
  //scanf("%s", p);
  printf(p, 10);
}

原因是 fgets() 只从标准输入中获取一行,它不关心该行中有什么字符。另一方面,scanf() 要求您准确指定哪些字符将以何种顺序出现。

有关更多信息,请参阅scanffgets的手册页。

于 2013-02-27T07:40:21.863 回答