201

printf()我知道您可以使用和打印puts()。我还可以看到它printf()允许您插入变量并进行格式化。

只是puts()一个原始版本的printf(). printf()是否应该在没有字符串插值的情况下将其用于所有可能的情况?

4

10 回答 10

164

putsprintf但要注意前者会自动附加换行符。如果这不是您想要的,您可以fputs将字符串转换为 stdout 或使用printf.

于 2010-03-16T13:06:06.430 回答
115

(Zan Lynx 在评论中指出了这一点,但我认为它值得一个回答——因为接受的答案没有提到它)。

puts(mystr);和之间的本质区别在于printf(mystr);,在后者中,参数被解释为格式化字符串。如果字符串不包含任何控制字符 ( %),结果通常是相同的(除了添加的换行符),但如果您不能依赖它(如果mystr是变量而不是文字),则不应 使用它。

因此,将动态字符串作为 的单个参数传递通常是危险的 - 并且在概念上是错误printf的:

  char * myMessage;
  // ... myMessage gets assigned at runtime, unpredictable content
  printf(myMessage);  // <--- WRONG! (what if myMessage contains a '%' char?) 
  puts(myMessage);    // ok
  printf("%s\n",myMessage); // ok, equivalent to the previous, perhaps less efficient

这同样适用于fputsvs fprintf(但fputs不添加换行符)。

于 2013-05-29T12:07:40.193 回答
38

除了格式化之外,puts如果成功或不成功,则返回一个非负整数EOF;whileprintf返回打印的字符数(不包括结尾的空值)。

于 2012-06-17T08:04:55.610 回答
18

在简单的情况下,编译器将调用转换printf()为调用puts().

例如,下面的代码将被编译成我接下来展示的汇编代码。

#include <stdio.h>
main() {
    printf("Hello world!");
    return 0;
}
push rbp
mov rbp,rsp
mov edi,str.Helloworld!
call dword imp.puts
mov eax,0x0
pop rbp
ret

在此示例中,我使用 GCC 版本 4.7.2 并使用gcc -o hello hello.c.

于 2013-09-12T19:21:32.913 回答
11
int puts(const char *s);

puts()将字符串 s 和一个尾随换行符写入标准输出。

int printf(const char *format, ...);

函数printf()在格式字符串的控制下将输出写入标准输出,该格式字符串指定后续参数如何转换为输出。

我将借此机会请您阅读文档。

于 2010-03-16T13:21:47.100 回答
11

以我的经验,无论格式字符串如何,都需要 printf()更多的代码。puts()

如果我不需要格式化,我不使用printf. 但是,fwriteto 的stdout工作速度比puts.

static const char my_text[] = "Using fwrite.\n";
fwrite(my_text, 1, sizeof(my_text) - sizeof('\0'), stdout);

注意:根据评论,'\0' 是一个整数常量。正确的表达方式应sizeof(char)如注释所示。

于 2010-03-16T20:07:36.800 回答
10

是的,printf可以被认为是一个更强大的版本puts。提供使用格式说明符(如、、等)格式化printf输出变量的能力...%s%d%lf

于 2010-03-16T13:05:58.177 回答
7

printf() 函数用于将字符串和变量都打印到屏幕上,而 puts() 函数只允许您将字符串打印到屏幕上。

于 2010-06-11T05:24:53.027 回答
2

puts是一个简单的选择,并在最后添加一个新行并printf从格式化的字符串写入输出。

请参阅 和 的puts 文档printf

我建议只使用printf它,因为这比切换方法更一致,即如果您正在调试,搜索所有 printfs 比搜索所有 printfs 更puts容易printf。大多数情况下,您也想在打印输出中输出变量,因此puts主要用于示例代码。

于 2015-06-16T12:16:42.697 回答
0

在比较puts()和时printf(),即使它们的内存消耗几乎相同,puts()与 相比也需要更多时间printf()

于 2015-05-11T11:20:12.750 回答