putchar()和printf()有什么区别?

18

我目前在1.5.1章节“文件复制”中,并编写了以下程序:

#include <stdio.h>

/* copy input to output; 1st version */
main()
{
    int c;

    c = getchar();
    while (c != EOF) {
        putchar(c);
        c = getchar();
    }
}

如果我像这样运行它:

PS <..loc..> cc copy-0.c
PS ./a
Black
Black
White
White
Gray
Gray

输出即是输入。

这是我为实验目的编写的程序:

#include <stdio.h>

/* copy input to output; 1st version */
main()
{
    int c;

    c = getchar();
    while (c != EOF) {
        printf("%c",c);
        c = getchar();
    }
}

它们产生相同的结果,但是putcharprintf之间有什么区别呢?

在这两者之间,哪一个更好用呢?


5
在这个例子中,printf("%c, c);putchar(c); 的行为是相同的。 - M.M
2
printf("%c, c)putchar(c)函数除了返回值不同外,其它方面是相同的——在这个例子中没有使用返回值。putchar(c)printf("%c, c)执行速度更快。速度差异的程度高度依赖于许多其他因素。 - chux - Reinstate Monica
1
@chux 为什么 putchar 很快,而 putchar_unlocked 更快? - Suraj Jain
1
优化编译器可能会为 printf("%c, c)putchar(c) 发出相同的代码,因此在这种情况下没有性能差异。对于不太智能的编译器,putchar(c) 由于其简单功能肯定比 printf("%c, c) 更快,尽管在没有测试的情况下,速度差异的程度是未知的,可能是微不足道的。putchar_unlocked() 不是标准 C 库函数 - 我不熟悉它的细节。 - chux - Reinstate Monica
5个回答

33

printf是一个通用的打印函数,可以使用100种不同的格式说明符并打印相应的结果字符串。而putchar则是将一个字符输出到屏幕上。这也意味着它可能会更快。

回到问题:使用putchar来打印单个字符。同样,它可能更快。


5
另外,putchar() 更短。如果你在打高尔夫游戏(即以代码长度为比赛标准),这会有所帮助。 - aloisdg
5
“putchar将一个字符输出到屏幕”最好的情况下是粗心大意,最坏的情况是严重误解。缓冲输出函数与“屏幕”毫不相干;它们完全不知道任何特定的硬件。putc宏包含将一个字符插入流中的代码。这种抽象是Unix(或类Unix)操作系统和运行时库的美妙之处,也是您可以将一个程序的输出管道传递给另一个程序的原因,或者在没有物理终端的情况下运行服务器的原因。 - Peter - Reinstate Monica

10

我使用 -S 编译了一个示例,其中包含语句 printf("a") ,在汇编代码中出现了调用 putchar 的情况。

看起来当你只有一个字符在 printf 中时,编译器会将其转换为 putchar()

我进行了另一个示例,使用语句 printf("ab"),在文本段中将其放入寄存器 %edi,并调用了 printf


2
你使用的是哪个平台和编译器? - Aaron D
5
这种优化由Clang 3.0及以上版本和GCC 4.9及以上版本完成。 - kirbyfan64sos

2
区别在于putchar只打印一个字符,而printf可以打印更多内容。
printf("%s\n", "this is a lot longer than one character");

通常在终端打印时,您需要以换行符'\n'结束。至少出于这个原因,我建议使用printf,因为您可以编写:

printf("%c\n", c);

替代

putchar(c);
putchar('\n');

1
没有投反对票,但那是一个糟糕的例子。putchar 调用似乎更好,而且这里也没有过度冗长。阅读起来也更容易。 - Thilo

1
  1. Putchar: 只打印一个字符到屏幕上,正如其语法所示。
  2. Printf: 在屏幕上打印一行或一个单词。因此,当您想在屏幕上仅显示一个字符时,请使用putchar。要读取字符串,请使用gets函数。要显示字符串,可以使用puts()或printf两者都可以。

0

printf 可以让你以复杂的方式格式化字符串,替换像整数、浮点数和其他字符串之类的东西。

getchar 和 putchar 用于获取和输出字符。

我可以说,与 putchar 相比,printf 在更多方面更有用。

最好在终端中查看它们各自的手册页面(man 3 printf man 3 putchar)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接