两个printf语句之间的比较

时间:2011-07-20 15:24:06

标签: c string compiler-construction printf

请查看以下两个c语句

printf("a very long string");
printf("%s","a very long string");

他们会产生相同的结果,但肯定会有一些差异引擎,所以有什么不同,哪一个更好 ?请分享您的想法!

6 个答案:

答案 0 :(得分:13)

如果你知道字符串内容是什么,你应该使用第一个表单,因为它更紧凑。如果您要打印的字符串可能来自用户或任何其他来源,使您不知道字符串内容是什么,则必须使用第二种形式;否则,您的代码将对format string injection attacks开放。

答案 1 :(得分:5)

第一个printf就像这样

'a' is not a special character: print it
' ' is not a special character: print it
'v' is not a special character: print it
...
'g' is not a special character: print it

第二个printf就像这样

'%' is a special character:
    's' print the contents of the string pointed to by the 2nd parameter

答案 2 :(得分:1)

第一个传递一个参数,第二个传递2,所以第一个参数调用稍快。

但是在第一个中,printf()必须扫描长字符串以获取格式规范,而在第二个中,格式字符串非常短,因此实际处理在第二个字符串中可能更快。

更重要的是(无论如何),“非常长的字符串”不太可能是一个常量字符串,就像在这个例子中一样。如果你打印一个长字符串,你可能正在使用一个指向程序生成的东西的指针。在这种情况下,使用第二种形式是一个更好的主意,因为否则在某个地方,某种程度上,某个时候,长字符串将包含格式printf格式规范,这将导致printf寻找另一个参数,你的程序将崩溃。大约一个星期前,这个确切的问题恰好发生在我用了近20年的代码中。

底线是你的printf格式规范应该始终是一个常量字符串。如果您需要输出变量,请使用printf("%s",var)或更好,fputs(var, stdout)

答案 3 :(得分:0)

第一个效率不低于第二个。由于没有格式序列且没有相应的参数,因此printf()函数不能完成任何工作。在第二种情况下,如果编译器不够聪明,无法捕捉到这一点,那么你将要求进行不必要的工作(注意:与实际发送(和读取!)终端输出相比微不足道。

答案 4 :(得分:0)

printf专为使用格式化进行打印而设计。为调试提供格式化参数更有用,尽管它们不是必需的。

%s采用const char *的值,而不保留任何参数只打印文字表达式。

您仍然可以显式地向const char *强制转换另一个指针,并在不更改输出表达式的情况下更改其内容。

答案 5 :(得分:0)

首先,你应该更好地定义“更好”,因为它本身并不够聪明。更好的方式?性能,维护,可读性,可扩展性......

在提供一行代码的情况下,我会为几乎所有版本的“更好”

选择选项1
  • 更可读
  • 它做它应该做的事情,仅此而已(KISS原则)
  • 它更快(没有毫无意义的移动内存将一个字符串填充到另一个字符串中)。但除非你在循环中做了很多次这样的打印,否则这不是一个很大的优点。