printf()和puts()在C中有什么区别?

时间:2010-03-16 13:03:29

标签: c printf

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

puts()仅仅是printf()的原始版本。它应该用于每个可能的printf()没有字符串插值吗?

10 个答案:

答案 0 :(得分:127)

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

答案 1 :(得分:83)

(Zan Lynx在评论中指出了这一点,但我认为它应该得到一个aswer - 假设接受的答案没有提到它。)

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

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

答案 2 :(得分:28)

除格式化外,puts如果成功则返回非负整数,如果不成功则返回EOF;而printf返回打印的字符数(不包括尾随空值)。

答案 3 :(得分:15)

在简单的情况下,编译器将对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编译了源代码。

答案 4 :(得分:11)

根据我的经验,无论格式字符串如何,printf()都会使用比puts()更多的代码。

如果我不需要格式化,我不使用printf。但是,fwritestdout的工作速度比puts快得多。

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

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

答案 5 :(得分:10)

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

答案 6 :(得分:8)

int puts(const char *s);

puts()将字符串s和尾部换行符写入stdout。

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

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

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

答案 7 :(得分:5)

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

答案 8 :(得分:2)

puts是一个简单的选择,最后添加一个新行,printf从格式化的字符串中写入输出。 看跌期权的文件:http://linux.die.net/man/3/puts 对于printf:http://linux.die.net/man/3/printf

我建议只使用printf,因为这比切换方法更加一致,即如果你正在进行调试,那么搜索所有printfs比使用print和printf更不痛苦。大多数情况下,您也希望在打印输出中输出变量,因此put主要用于示例代码中。

答案 9 :(得分:1)

比较puts()printf()时,即使他们的内存消耗几乎相同,puts()printf()相比需要更多时间。