我知道你可以用printf()和打印puts().我还可以看到,printf()允许您插入变量并进行格式化.
是否puts()仅仅是一种原始的版本printf().是否应该在printf()没有字符串插值的情况下使用它?
Mic*_*fik 133
puts比较简单,printf但要注意前者会自动添加换行符.如果这不是你想要的,你可以fputs将你的字符串添加到stdout或使用printf.
leo*_*loy 88
(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
Run Code Online (Sandbox Code Playgroud)
这同样适用于fputsvs fprintf(但fputs不添加换行符).
小智 16
在简单的情况下,编译器将调用转换printf()为调用puts().
例如,以下代码将编译为我接下来显示的汇编代码.
#include <stdio.h>
main() {
printf("Hello world!");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
push rbp
mov rbp,rsp
mov edi,str.Helloworld!
call dword imp.puts
mov eax,0x0
pop rbp
ret
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我使用GCC版本4.7.2并使用编译源代码gcc -o hello hello.c.
Tho*_*ews 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);
Run Code Online (Sandbox Code Playgroud)
注意:每个注释,'\ 0'是一个整数常量.正确的表达应该sizeof(char)如评论所示.
小智 8
int puts(const char *s);
Run Code Online (Sandbox Code Playgroud)
puts()将字符串s和尾部换行符写入stdout.
int printf(const char *format, ...);
Run Code Online (Sandbox Code Playgroud)
函数printf()在格式字符串的控制下将输出写入stdout,格式字符串指定后续参数如何转换为输出.
我将借此机会请您阅读文档.