两个 printf 语句的比较

问题描述 投票:0回答:6

请看一下下面两条c语句

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

它们产生相同的结果,但是在引擎盖下肯定存在一些差异,那么有什么区别以及哪个是更好?请分享您的想法!

c string printf
6个回答
13
投票

如果你知道字符串内容是什么,你应该使用第一种形式,因为它更紧凑。如果您要打印的字符串可能来自用户或任何其他来源,以致您不知道字符串内容是什么,则必须使用第二种形式;否则,您的代码将很容易受到格式字符串注入攻击


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

1
投票

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

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

更重要的是(无论如何对我来说),“一个非常长的字符串”不太可能像本例中那样是一个常量字符串。如果您正在打印一个长字符串,则可能正在使用指向程序生成的内容的指针。 在这种情况下,使用第二种形式是一个更好的主意,因为否则在某个地方,不知何故,有时,长字符串将包含格式 printf 格式规范,这将导致 printf 去寻找另一个参数,并且您的程序将崩溃。 大约一周前,这个问题刚刚发生在我身上,我们已经使用了近 20 年的代码。

最重要的是,你的 printf 格式规范应该始终是一个常量字符串。 如果您需要输出变量,请使用

printf("%s",var)
或更好,
fputs(var, stdout)


0
投票

第一个的效率并不比第二个低。由于没有格式序列,也没有相应的参数,因此 printf() 函数不必执行任何操作。在第二种情况下,如果编译器不够聪明,无法捕获这种情况,您将需要进行不必要的工作(注意:与在终端实际发送(和读取!)输出相比,这是微不足道的。


0
投票

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

%s 接受 const char* 的值,而不保留参数则仅打印文字表达式。

您仍然可以显式地将不同的指针强制转换为 const char* 并更改其内容,而不更改输出表达式。


0
投票

首先你应该更好地定义“更好”,因为它本身不够智能。用什么方式比较好?性能、维护、可读性、可扩展性......

通过给出的一行代码,我会为几乎所有版本的“更好”选择选项 1

  • 更易读
  • 它做了它应该做的事,仅此而已(KISS原则)
  • 速度更快(无需无意义地移动内存将一个字符串填充到另一个字符串中)。但除非你在循环中多次执行 printf 操作,否则这并不是一个很大的优点。
© www.soinside.com 2019 - 2024. All rights reserved.