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);
在上面代码的上下文中,这三者有什么区别?
printf("%s",s);
printf(s);
fputs(s,stdout);
printf("%s",s);
正确,但 printf 是一个非常重的函数,如果格式字符串以 '\n'[=12= 结尾,大多数编译器实际上会将其替换为编译器代码中的 puts ]
printf(s);非常危险,因为格式字符串可能包含 %
然后它会期待另一个参数。如果它发生了,那就是 UB。它还使您的代码容易受到攻击
fputs(s,stdout);好的。不如 printf 重,但会添加新行
#2 应该永远不会被使用。我什至不会在这里写。恶意输入可以通过引入特殊字符在您的系统中做非常糟糕的事情。 gcc
的新版本就此错误向您发出警告。
两者的区别
printf("%s", s);
和
puts(s)
是 puts
会添加一个换行符,就像你打电话一样
printf("%s\n", s);
正如其他评论和答案所提到的,不要尝试第二个选项。还有,第三个比第一个轻很多。
但是,我仍然更喜欢第一个选项(printf()
函数),因为它允许您拥有格式化字符串,这意味着您可以使用此函数打印出几乎任何数据类型,而函数 fputs
只接受字符串。所以在大多数情况下,您必须先格式化字符串(可能使用 sprintf()
),然后再将其传递给函数 !
char s[100]={0};
fgets(s, sizeof(s), stdin);
在上面代码的上下文中,这三者有什么区别?
printf("%s",s);
printf(s);
fputs(s,stdout);
printf("%s",s);
正确,但 printf 是一个非常重的函数,如果格式字符串以 '\n'[=12= 结尾,大多数编译器实际上会将其替换为编译器代码中的 puts ]printf(s);非常危险,因为格式字符串可能包含
%
然后它会期待另一个参数。如果它发生了,那就是 UB。它还使您的代码容易受到攻击fputs(s,stdout);好的。不如 printf 重,但会添加新行
#2 应该永远不会被使用。我什至不会在这里写。恶意输入可以通过引入特殊字符在您的系统中做非常糟糕的事情。 gcc
的新版本就此错误向您发出警告。
两者的区别
printf("%s", s);
和
puts(s)
是 puts
会添加一个换行符,就像你打电话一样
printf("%s\n", s);
正如其他评论和答案所提到的,不要尝试第二个选项。还有,第三个比第一个轻很多。
但是,我仍然更喜欢第一个选项(printf()
函数),因为它允许您拥有格式化字符串,这意味着您可以使用此函数打印出几乎任何数据类型,而函数 fputs
只接受字符串。所以在大多数情况下,您必须先格式化字符串(可能使用 sprintf()
),然后再将其传递给函数 !