我知道您可以使用printf()
和puts()
进行打印。我还可以看到printf()
允许您插入变量并进行格式化。
puts()
仅仅是printf()
的原始版本。它应该用于每个可能的printf()
没有字符串插值吗?
答案 0 :(得分:127)
puts
比printf
简单,但要注意前者会自动添加换行符。如果这不是您想要的,您可以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
。但是,fwrite
到stdout
的工作速度比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()
相比需要更多时间。