我知道你可以用printf()和puts()进行打印。我还可以看到printf()允许您插入变量并进行格式化。
是puts()仅仅是printf()的原始版本。它是否应该用于所有可能的printf()而不进行字符串插值?
我知道你可以用printf()和puts()进行打印。我还可以看到printf()允许您插入变量并进行格式化。
是puts()仅仅是printf()的原始版本。它是否应该用于所有可能的printf()而不进行字符串插值?
当前回答
(Zan Lynx在评论中指出了这一点,但我认为它应该得到一个答案——考虑到公认的答案没有提到它)。
put (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不添加换行符)。
其他回答
在简单的情况下,编译器将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编译源代码。
当比较puts()和printf()时,尽管它们的内存消耗几乎相同,但puts()比printf()花费更多的时间。
根据我的经验,无论格式字符串如何,printf()都会比puts()引入更多的代码。
如果我不需要格式化,我就不用printf。但是,fwrite到stdout的速度要比put快得多。
static const char my_text[] = "Using fwrite.\n";
fwrite(my_text, 1, sizeof(my_text) - sizeof('\0'), stdout);
注意:每个注释中,'\0'是一个整数常量。正确的表达式应该是sizeof(char),如注释所示。
除了格式化,如果成功,puts返回一个非负整数,如果不成功,则返回EOF;而printf返回打印的字符数(不包括后面的null)。
printf可以被认为是一个更强大的版本。Printf提供了使用格式说明符(如%s, %d, %lf等)格式化输出变量的能力。