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

我知道你可以使用printf()puts()来打印。 我也可以看到printf()允许你插入variables并进行格式化。

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

putsprintf简单,但要注意前者会自动附加一个换行符。 如果这不是你想要的,你可以把你的string输出到标准输出或使用printf

(这在Zan Lynx的评论中指出,但我认为这是值得的 – 因为接受的答案没有提到它)。

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

所以,对于printf的第一个参数使用一个variables通常是危险的,而且在概念上是错误的:

  char * myMessage; // ... myMessage gets filled at runtime with some unpredictable content printf(myMessage); // WRONG! (what if myMessage contains a '%' char?) puts(myMessage); // correct printf("%s\n",myMessage); // equivalent to the above, perhaps less efficient 

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

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

在简单情况下,编译器将调用转换为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编译源代码。

对, printf可以被认为是一个更强大的puts版本。 printf提供了使用格式说明符(如%s%d%lf等)格式化输出variables的function。

根据我的经验,不pipe格式string如何, printf()都比puts()更多的代码。

如果我不需要格式化,我不使用printf 。 但是, fwritestdoutfwrite更快。

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

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

 int puts(const char *s); 

puts()将strings和尾部换行符写入stdout。

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

函数printf()在格式string的控制下将输出写入标准输出,格式string指定后续参数如何转换以进行输出。

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

printf()函数用于将string和variables都打印到屏幕上,而puts()函数只允许将string打印到屏幕上。

puts是最简单的select,并在最后添加一个新行,printf从格式化的string写入输出。 puts的文档: http : //linux.die.net/man/3/puts和printf: http : //linux.die.net/man/3/printf

我build议只使用printf,因为这比switch方法更加一致,也就是说,如果你是debbugging,那么search所有的printf比put和printf更不容易。 大多数时候你也想在你的打印输出中输出一个variables,所以put主要用在示例代码中。

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