printf("%s")、printf(s) 和 fputs 之间有什么区别?

What is the difference between printf("%s"), printf(s) and fputs?

char s[100]={0};
fgets(s, sizeof(s), stdin);

在上面代码的上下文中,这三者有什么区别?

  1. printf("%s",s);
  2. printf(s);
  3. fputs(s,stdout);
  1. printf("%s",s); 正确,但 printf 是一个非常重的函数,如果格式字符串以 '\n'[=12= 结尾,大多数编译器实际上会将其替换为编译器代码中的 puts ]

  2. printf(s);非常危险,因为格式字符串可能包含 % 然后它会期待另一个参数。如果它发生了,那就是 UB。它还使您的代码容易受到攻击

  3. fputs(s,stdout);好的。不如 printf 重,但会添加新行

#2 应该永远不会被使用。我什至不会在这里写。恶意输入可以通过引入特殊字符在您的系统中做非常糟糕的事情。 gcc 的新版本就此错误向您发出警告。

两者的区别 printf("%s", s);puts(s)puts 会添加一个换行符,就像你打电话一样 printf("%s\n", s);

正如其他评论和答案所提到的,不要尝试第二个选项。还有,第三个比第一个轻很多。

但是,我仍然更喜欢第一个选项(printf() 函数),因为它允许您拥有格式化字符串,这意味着您可以使用此函数打印出几乎任何数据类型,而函数 fputs 只接受字符串。所以在大多数情况下,您必须先格式化字符串(可能使用 sprintf()),然后再将其传递给函数 !