繁体   English   中英

在c中将字符串传递给printf

[英]passing a string to printf, in c

将字符串传递给printf不能正常工作的代码:

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

输入: value:%d\\n

预期输出: value:10

输出: value:10\\n

另外,我在不同的时间得到了不同的输出。 3次连续执行时,相同a.ou​​t的输出:

$。/ 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的结果

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

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

另外,请注意scanf停在任何空白处,因此输入value: xxx将仅产生value:进入缓冲区。 如果您想读取整行,则应改用fgets类的函数。

您的代码的行为与预期的完全一样。 在第一个示例中,您在“ 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()仅从stdin中获得一行,它不在乎该行中的字符。 另一方面,scanf()要求您确切指定将以什么顺序出现的字符。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM