我目前正在进行第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();
}
}
它会产生相同的结果,但putchar
和printf
之间是否存在差异?
哪个更适合在2?
之间使用答案 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)
答案 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