2013-02-27 138 views
0

传递串给printf工作不正常 代码:传递字符串给printf,在C

char p[50]; 
scanf("%s", p); 
printf(p, 10); 

输入:value:%d\n

预期输出:value:10

输出:value:10\n

也,我在不同的时间得到不同的输出。相同的a.out的输出在3个连续执行:

$/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

+1

我不相信你的代码和例子的输出。文本“值”出现在输出中,但不在代码中。你*键入*'价值'? – unwind 2013-02-27 07:34:22

+1

@unwind它出现在输入中。他将输入作为第一个参数传递给'printf' – 2013-02-27 07:36:13

+1

它是否像将用户输入字符串直接传递给'printf'一样糟糕? – 2013-02-27 07:37:36

回答

4

真的小心通过用户提供的文本作为第一个参数printf,或者你将有一个格式化字符串漏洞。此外,通过使用裸露的scanf,您也容易受到缓冲区溢出的影响。 (两个漏洞中只有三行代码!)

这就是说,你为什么在你的输出得到一个字面\n的原因是因为当你在控制台输入\n,你会得到一个反斜杠后跟一个字符串n,而不是一个换行符。

另外,还要注意scanf停在任何空白,在value: xxx所以打字只会造成value:进入缓冲区。如果你想读整行,你应该使用像fgets这样的函数。

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