putchar()vs printf() - 有区别吗?

时间:2014-05-20 01:48:20

标签: c printf getchar putchar

我目前正在进行第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之间是否存在差异?

哪个更适合在2?

之间使用

6 个答案:

答案 0 :(得分:18)

printf是一个通用打印功能,可以使用100种不同的格式说明符并打印正确的结果字符串。 putchar,好吧,将一个角色放到屏幕上。这也意味着它可能会更快。

回到问题:使用putchar打印单个字符。再说一次,它可能要快得多。

答案 1 :(得分:5)

我使用带有-S的printf(“a”)编译了一个示例,并在汇编代码中调用了putchar。 看起来当printf中只有一个char时,编译器会将其转换为putchar()。 我用printf(“ab”)做了另一个例子,并调用了printf,%edi寄存器中有文本部分。

答案 2 :(得分:0)

区别在于putchar打印一个字符,而printf可以打印更多字符。

printf("%s\n", "this is a lot longer than one character");

通常,当您在终端上打印某些内容时,您需要使用换行符'\n'来结束它。至少出于这个原因,我建议使用printf,然后你可以写

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

而不是

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

答案 3 :(得分:0)

printf允许您以复杂的方式格式化字符串,替换整数和浮点数等字符串。

getchar和putchar获取并放置字符

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

最好在终端

中查看各自的手册页(man 3 printf man 3 putchar)

答案 4 :(得分:0)

  1. Putchar:语法告诉我在屏幕上只打印一个字符。
  2. Printf:屏幕上的printf行或单词。 因此,当您想在屏幕上只显示一个字符时,请使用putchar。 要读取字符串,请使用gets函数。 要显示字符串,您可以使用puts()或printf。

答案 5 :(得分:0)

这是一个了不起的问题,尽管距离提出它已经有5年了。
目前,我正在学习有关多进程的知识,并使用C进行一些练习
我发现一个令人困惑的问题:使用fork()
子进程可以获得“之前发生”的信息!

#include <stdio.h>
#include <unistd.h>
int main(void) 
{      
int p1;                                                                                                                 putchar('x');
printf("this is father!\n");
printf("fork() begin!\n");
putchar('a');
p1 = fork();
while(p1==-1);
if(p1==0)
putchar('b');
else
putchar('a');
putchar('y');
putchar(10);
printf("%s\n",(!p1)? "father":"son");
}         

输出为

"xthis is father!
fork() begin!
aay
aby
son
father "

很奇怪?父进程和子进程putchar('a')都在fork()之前!
甚至可以在fork()之前放置数百万个putchar(),它们都由父进程和子进程运行。但是,printf并没有受到影响。
我试图找出它并在stackOverflow中寻找它,发现这个问题 而且我猜想它与buff有关,例如putchar()和printf,它们都设置了一个buff并在遇到\ n时打印了字符串,因此在这种情况下,子进程会复制父级的buff,因此看起来会回滚代码并执行上一个putchar