请看一下下面两条c语句
printf("a very long string");
printf("%s","a very long string");
它们产生相同的结果,但是在引擎盖下肯定存在一些差异,那么有什么区别以及哪个是更好?请分享您的想法!
如果你知道字符串内容是什么,你应该使用第一种形式,因为它更紧凑。如果您要打印的字符串可能来自用户或任何其他来源,以致您不知道字符串内容是什么,则必须使用第二种形式;否则,您的代码将很容易受到格式字符串注入攻击。
第一个
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个参数,所以第一个调用稍微快一些。
但是在第一个中,printf() 必须扫描长字符串以获取格式规范,而在第二个中,格式字符串非常短,因此第二个中的实际处理可能更快。
更重要的是(无论如何对我来说),“一个非常长的字符串”不太可能像本例中那样是一个常量字符串。如果您正在打印一个长字符串,则可能正在使用指向程序生成的内容的指针。 在这种情况下,使用第二种形式是一个更好的主意,因为否则在某个地方,不知何故,有时,长字符串将包含格式 printf 格式规范,这将导致 printf 去寻找另一个参数,并且您的程序将崩溃。 大约一周前,这个问题刚刚发生在我身上,我们已经使用了近 20 年的代码。
最重要的是,你的 printf 格式规范应该始终是一个常量字符串。 如果您需要输出变量,请使用
printf("%s",var)
或更好,fputs(var, stdout)
。
第一个的效率并不比第二个低。由于没有格式序列,也没有相应的参数,因此 printf() 函数不必执行任何操作。在第二种情况下,如果编译器不够聪明,无法捕获这种情况,您将需要进行不必要的工作(注意:与在终端实际发送(和读取!)输出相比,这是微不足道的。
printf 专为使用 formatting 进行打印而设计。为了调试而提供格式化参数更有用,尽管它们不是必需的。
%s 接受 const char* 的值,而不保留参数则仅打印文字表达式。
您仍然可以显式地将不同的指针强制转换为 const char* 并更改其内容,而不更改输出表达式。
首先你应该更好地定义“更好”,因为它本身不够智能。用什么方式比较好?性能、维护、可读性、可扩展性......
通过给出的一行代码,我会为几乎所有版本的“更好”选择选项 1