我知道你可以用printf()和puts()进行打印。我还可以看到printf()允许你插入变量和进行格式化。
printf()
puts()
puts()仅仅是printf()的原始版本吗?它是否应该用于所有可能的printf()而不进行字符串插值?
是的,printf可以被认为是puts的一个更强大的版本。printf提供了使用诸如%s、%d、%lf等格式说明符为输出格式变量的能力。
printf
puts
%s
%d
%lf
puts比printf简单,但要注意前者会自动添加换行符。如果这不是你想要的,你可以fputs你的字符串到标准输出或使用printf。
fputs
int puts(const char *s);
将()将字符串s和后面的换行符写入stdout。
int printf(const char *format, ...);
函数printf ()在格式字符串的控制下将输出写入stdout,该格式字符串指定如何将后续参数转换为输出。
我将利用这个机会请您阅读文档。
根据我的经验,无论格式字符串如何,printf()比puts()引入更多的代码。
如果我不需要格式化,我不使用printf。然而,fwrite到stdout的工作速度比puts快得多。
fwrite
stdout
static const char my_text[] = "Using fwrite.\n"; fwrite(my_text, 1, sizeof(my_text) - sizeof('\0'), stdout);
注意:每个注释中,'\0'是一个整数常量。正确的表达式应该是sizeof(char),如注释所示。
sizeof(char)
printf()函数用于将字符串和变量打印到屏幕上,而puts()函数只允许将字符串打印到屏幕上。
除了格式化,puts如果成功返回一个非负整数,如果不成功返回EOF;而printf返回打印的字符数(不包括后面的null)。
EOF
(Zan Lynx在评论中指出了这一点,但我认为它应该得到一个答案——考虑到公认的答案没有提到它)。
puts(mystr);和printf(mystr);之间的本质区别是,后者的实参被解释为格式化字符串。如果字符串不包含任何控制字符(%),结果通常是相同的(除了添加换行符),但如果你不能依赖它(如果mystr是变量而不是文字),你应该使用不。
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不添加换行符)。
fprintf
在简单的情况下,编译器将对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编译源代码。
gcc -o hello hello.c
当比较puts()和printf()时,尽管它们的内存消耗几乎相同,但puts()比printf()花费更多的时间。
puts是一个简单的选择,它在最后添加了一个新行,而__abc1从一个格式化的字符串中写入输出。
参见puts的文档 和printf。< / p >
我建议只使用printf,因为这比切换方法更一致,也就是说,如果你正在调试,搜索所有printfs比puts和printf更少痛苦。大多数时候,你也想在打印输出中输出一个变量,所以puts主要用于示例代码。