printf()
我知道您可以使用和打印puts()
。我还可以看到它printf()
允许您插入变量并进行格式化。
只是puts()
一个原始版本的printf()
. printf()
是否应该在没有字符串插值的情况下将其用于所有可能的情况?
puts
比printf
但要注意前者会自动附加换行符。如果这不是您想要的,您可以fputs
将字符串转换为 stdout 或使用printf
.
(Zan Lynx 在评论中指出了这一点,但我认为它值得一个回答——因为接受的答案没有提到它)。
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
不添加换行符)。
除了格式化之外,puts
如果成功或不成功,则返回一个非负整数EOF
;whileprintf
返回打印的字符数(不包括结尾的空值)。
在简单的情况下,编译器将调用转换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
.
int puts(const char *s);
puts()将字符串 s 和一个尾随换行符写入标准输出。
int printf(const char *format, ...);
函数printf()在格式字符串的控制下将输出写入标准输出,该格式字符串指定后续参数如何转换为输出。
我将借此机会请您阅读文档。
以我的经验,无论格式字符串如何,都需要 printf()
更多的代码。puts()
如果我不需要格式化,我不使用printf
. 但是,fwrite
to 的stdout
工作速度比puts
.
static const char my_text[] = "Using fwrite.\n";
fwrite(my_text, 1, sizeof(my_text) - sizeof('\0'), stdout);
注意:根据评论,'\0' 是一个整数常量。正确的表达方式应sizeof(char)
如注释所示。
是的,printf
可以被认为是一个更强大的版本puts
。提供使用格式说明符(如、、等)格式化printf
输出变量的能力...%s
%d
%lf
printf() 函数用于将字符串和变量都打印到屏幕上,而 puts() 函数只允许您将字符串打印到屏幕上。
在比较puts()
和时printf()
,即使它们的内存消耗几乎相同,puts()
与 相比也需要更多时间printf()
。