关于C#:putchar()vs printf()-有区别吗?

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();
    }
}

它产生相同的结果,但是putcharprintf之间有区别吗?

两者之间哪个更好用?


printf是通用打印功能,可与100个不同格式的说明符一起使用并打印正确的结果字符串。 putchar可以在屏幕上放置一个字符。这也意味着它可能要快得多。

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


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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <unistd.h>
int main(void)
{      
int p1;                                                                                                                 putchar('x');
printf("this is father!\
"
);
printf("fork() begin!\
"
);
putchar('a');
p1 = fork();
while(p1==-1);
if(p1==0)
putchar('b');
else
putchar('a');
putchar('y');
putchar(10);
printf("%s\
"
,(!p1)?"father":"son");
}

输出是

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,这样您就可以编写

    1
    2
    printf("%c\
    "
    , c);

    代替

    1
    2
    3
    putchar(c);
    putchar('\
    '
    );