printf()和puts()在C中有什么区别?
我知道你可以使用printf()
和puts()
来打印。 我也可以看到printf()
允许你插入variables并进行格式化。
puts()
仅仅是printf()
一个原始版本。 它应该用于每一个可能的printf()
没有string插值?
puts
比printf
简单,但要注意前者会自动附加一个换行符。 如果这不是你想要的,你可以把你的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
这同样适用于fputs
和fprintf
(但是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
。 但是, fwrite
到stdout
比fwrite
更快。
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()
需要更多的时间。