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

ale*_*lex 165 c printf

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

是否puts()仅仅是一种原始的版本printf().是否应该在printf()没有字符串插值的情况下使用它?

Mic*_*fik 133

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

  • 我认为提及printf用于在输出字符串中添加其他变量的附加参数也很重要. (5认同)

leo*_*loy 88

(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
Run Code Online (Sandbox Code Playgroud)

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

  • @franklin在运行时,因为`printf`需要解析格式字符串.但是,这通常应该是无关紧要的.此外,一个聪明的编译器可以优化它,并用`puts`替换`printf` (9认同)

ech*_*son 30

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


小智 16

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

例如,以下代码将编译为我接下来显示的汇编代码.

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

在这个例子中,我使用GCC版本4.7.2并使用编译源代码gcc -o hello hello.c.

  • 那么在stdout放置新线路怎么样? (8认同)
  • @KorayTugay:gcc的`-save-temps`选项可以做到这一点 (3认同)
  • 它应该是``printf("Hello world!\n");`` gcc 确实将其转换为 puts。由于是旧信息,我会自己编辑。 (2认同)
  • 在编译C代码后,您是如何阅读汇编代码的? (2认同)

Tho*_*ews 11

根据我的经验,不管格式字符串如何,都会printf()输入更多代码puts().

如果我不需要格式化,我不使用printf.然而,fwritestdout作品比快了很多puts.

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

注意:每个注释,'\ 0'是一个整数常量.正确的表达应该sizeof(char)如评论所示.

  • 这个答案是不正确的.`'\ 0'`的类型为`int`,因此在大多数系统中都会打印`using fwrit`.如果你想打印少1个字节,只需使用1.`sizeof(char)`,这可能是你想要的,保证是1. (6认同)
  • @AntonyHatchkins它通常不会"快得多".然而,puts()必须每次对字符串执行strlen()调用,而如果使用fwrite()知道大小,则可以避免.这几乎是性能差异的唯一真正贡献者. (5认同)
  • "fdrite到stdout比put更快." - 可能是什么原因? (2认同)

Jus*_*ier 10

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


小智 8

int puts(const char *s);
Run Code Online (Sandbox Code Playgroud)

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

int printf(const char *format, ...);
Run Code Online (Sandbox Code Playgroud)

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

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


小智 5

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