Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的printf()和put()有什么区别?_C_String_Output_Printf_Puts - Fatal编程技术网

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个字节,只需使用1
sizeof(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