请查看以下两个c语句
printf("a very long string");
printf("%s","a very long string");
他们会产生相同的结果,但肯定会有一些差异引擎,所以有什么不同,哪一个更好 ?请分享您的想法!
答案 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