C中的printf()和put()有什么区别?
我知道您可以使用C中的printf()和put()有什么区别?,c,string,output,printf,puts,C,String,Output,Printf,Puts,我知道您可以使用printf()和put()打印。我还可以看到,printf()允许您插入变量并进行格式化 只是printf()的原始版本。它是否应该用于所有可能的printf()而不使用字符串插值?对,printf可以被认为是put的更强大版本printf提供了使用格式说明符(如%s、%d、%lf等)格式化输出变量的能力。puts比printf简单,但请注意前者会自动追加一个换行。如果这不是您想要的,您可以fputs将字符串转换为标准输出或使用printf int puts(const cha
printf()
和put()
打印。我还可以看到,printf()
允许您插入变量并进行格式化
只是
printf()
的原始版本。它是否应该用于所有可能的printf()
而不使用字符串插值?对,printf
可以被认为是put
的更强大版本printf
提供了使用格式说明符(如%s
、%d
、%lf
等)格式化输出变量的能力。puts
比printf
简单,但请注意前者会自动追加一个换行。如果这不是您想要的,您可以fputs
将字符串转换为标准输出或使用printf
int puts(const char *s);
put()将字符串s和尾随换行符写入标准输出
int printf(const char *format, ...);
函数printf()在指定后续参数如何转换为输出的格式字符串的控制下,将输出写入标准输出
我将利用这个机会请您阅读文档。根据我的经验,
printf()
比put()
带来更多的代码,而不管格式字符串如何
如果我不需要格式化,我就不使用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)
printf()函数用于将字符串和变量打印到屏幕上,而put()函数仅允许您将字符串打印到屏幕上 除了格式化,如果成功,put
返回一个非负整数,如果失败,EOF
返回一个非负整数;而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
char*myMessage;
// ... myMessage在运行时被分配,内容不可预测
printf(myMessage);// 在简单的情况下,编译器将对printf()
的调用转换为对put()
的调用
例如,下面的代码将被编译成我接下来展示的汇编代码
#include <stdio.h>
main() {
printf("Hello world!");
return 0;
}
在本例中,我使用了GCC版本4.7.2,在比较put()
和printf()
时,使用GCC-o hello.c
编译源代码,即使它们的内存消耗几乎相同,put()
比printf()
花费更多的时间 put
是一个简单的选择,它在末尾添加一个新行,printf
从格式化字符串写入输出
有关详细信息,请参阅文档
还有
我建议只使用printf
,因为这比切换方法更一致,也就是说,如果您要去bug,搜索所有printf比搜索put
和printf
更省力。大多数情况下,您也希望在打印输出中输出变量,因此示例代码中通常使用put
。“写入标准输出比输出快得多。”-可能的原因是什么?@AntonyHatchkins它通常不会“快很多”。但是,puts()每次都必须对字符串执行strlen()调用,而如果通过fwrite()知道大小,则可以避免调用。这几乎是造成性能差异的唯一真正原因。这个答案是错误的<代码>'\0'
具有类型int
,因此在大多数系统上,这将使用fwrit
打印。如果要少打印1个字节,只需使用1sizeof(char)
,这很可能是您在这里想要的,保证为1。那么将位置放入stdout的新行呢?它应该是printf(“Hello world!\n”)代码>gcc确实将其转换为puts。由于这是一条旧消息,我将自己编辑它。编译C代码后,您是如何读取汇编代码的?@KorayTugay:gcc的-save temps
选项可以做到这一点,您也可以使用像gdb这样的工具来反汇编二进制文件。只需注意使用printf而不是puts:永远不要使用printf(变量)
来打印字符串。使用put(variable)
或printf(“%s”,variable)
。使用变量格式字符串存在安全风险:如果攻击者可以编写变量,他们可以使用格式字符串攻击程序。使用printf()的方式是什么
效率较低?在运行时?在编译时?@franklin在运行时,因为printf
需要解析格式字符串。然而,这通常是不相关的。此外,一个聪明的编译器可以对此进行优化,并用调用put
替换printf
,我认为提及附加内容也很重要printf用于向输出字符串中添加其他变量的nal参数。请为您的答案添加一些解释,以便其他人可以从中学习-您是否有可靠的声明来源?或者有一些原因来解释此差异?当我测试此项时,puts返回中的字符数
push rbp
mov rbp,rsp
mov edi,str.Helloworld!
call dword imp.puts
mov eax,0x0
pop rbp
ret