putchar() vs printf() - Is there a difference?
我目前在第1.5.1章中进行文件复制,并制作了一个程序,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13
| #include <stdio.h>
/* copy input to output; 1st version */
main ()
{
int c ;
c = getchar();
while (c != EOF ) {
putchar(c );
c = getchar();
}
} |
如果我这样运行:
1 2 3 4 5 6 7 8
| PS <..loc..> cc copy-0.c
PS ./a
Black
Black
White
White
Gray
Gray |
输出是我输入的。
这是我出于实验目的制作的程序:
1 2 3 4 5 6 7 8 9 10 11 12 13
| #include <stdio.h>
/* copy input to output; 1st version */
main ()
{
int c ;
c = getchar();
while (c != EOF ) {
printf("%c",c );
c = getchar();
}
} |
它产生相同的结果,但是putchar和printf之间有区别吗?
两者之间哪个更好用?
-
在此示例中,printf("%c, c);和putchar(c);具有相同的行为。
-
printf("%c, c)和putchar(c)的功能相同,但返回值不同-在此示例中未使用。 putchar(c)的性能肯定会比printf("%c, c)快。 速度差异的程度高度取决于许多其他因素。
-
@chux为什么putchar会更快,为什么putchar_unlocked会更快?
-
@SurajJain优化的编译器可能会为printf("%c, c)和putchar(c)发出相同的代码,因此在这种情况下性能没有差异。 使用智能程度较低的编译器putchar(c)具有简单的功能肯定会比printf("%c, c)更快,尽管未经测试,速度差异的程度是未知的并且可能是微不足道的。 putchar_unlocked()不是标准的C库函数-我不熟悉其详细信息。
printf是通用打印功能,可与100个不同格式的说明符一起使用并打印正确的结果字符串。 putchar可以在屏幕上放置一个字符。这也意味着它可能要快得多。
回到问题:使用putchar打印单个字符。同样,它可能要快得多。
-
putchar()也较短。 如果您打高尔夫球,可以提供帮助。
-
" putchar将角色放到屏幕上"充其量是草率的,最坏的情况是严重的误解。 缓冲的输出功能对"屏幕"一无所知。 他们完全不理会任何特定的硬件。 putc宏包含将字符插入流中的代码。 这种抽象是* nix(受启发的)操作系统和运行时库的魅力所在,也是您可以将一个程序的输出通过管道传输到另一个程序的输入,或运行没有任何物理终端的服务器的原因。
我使用带-S的printf(" a")编译了一个示例,并在汇编代码中调用了putchar。
看起来在printf中只有一个char时,编译器将其转换为putchar()。
我做了另一个使用printf(" ab")的例子,并调用了printf,其中的文本部分位于%edi寄存器中。
-
您使用的是哪个平台和编译器?
-
@AaronD此优化由Clang 3.0及更高版本以及GCC 4.9及更高版本执行。
这是一个了不起的问题,尽管距离提出它已经有5年了。
目前,我正在学习有关多进程的知识,并使用C进行一些练习
我发现一个困惑的问题:使用fork()时
子进程可以获得"之前发生"的信息!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| |
输出是
1 2 3 4 5 6
| "xthis is father!
fork() begin!
aay
aby
son
father" |
奇怪的?父进程和子进程putchar('a')都在fork()之前!
您甚至可以在fork()之前放置数百万个putchar(),它们都由父进程和子进程运行。但是,printf并没有受到影响。
我试图找出它并在stackOverflow中寻找它,发现这个问题
而且我猜想它与buff有关,例如putchar()和printf,它们都设置了一个buff并在遇到\ n时打印了字符串,因此在这种情况下,子进程会复制父级的buff,因此它看起来会回滚代码并执行上一个putchar
-
如果这是一个问题,请不要将其用作答案。 问一个问题!
Putchar:语法说明,Putchar仅在屏幕上打印一个字符。
Printf:屏幕上的printf行或单词。
因此,当您只想在屏幕上显示一个字符时,请使用putchar。
要读取字符串,请使用gets函数。
要显示字符串,可以同时使用puts()或printf。
printf使您可以用复杂的方式设置字符串格式,用整数,浮点数和其他字符串代替。
getchar和putchar获取和放置字符
我可以说,与putchar相比,printf在更多方面更有用。
更好地查看终端中各自的手册页(man 3 printf man 3 putchar)
区别在于putchar打印一个字符,而printf可以打印更多字符。
1 2
| printf("%s\
","this is a lot longer than one character"); |
通常,当您在终端上打印某些内容时,您希望以换行符'\
'结尾。至少出于这个原因,我建议使用printf,这样您就可以编写
代替
-
没有下注,但这是一个不好的例子。 putchar调用似乎更好,在这里甚至不会太冗长。 也更容易阅读。