web-dev-qa-db-ja.com

putchar()とprintf()-違いはありますか?

私は現在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つの間でどちらを使用するのが良いですか?

9
user3649506

printfは、100の異なるフォーマット指定子で機能し、適切な結果文字列を出力する汎用の印刷関数です。 putcharは、まあ、画面に文字を配置します。それはまたそれがおそらくはるかに速いことを意味します。

質問に戻る:putcharを使用して1文字を印刷します。繰り返しますが、おそらくはるかに高速です。

20
kirbyfan64sos

Printf( "a")と-Sを使用して例をコンパイルし、アセンブリコードでputcharを呼び出しました。 printfに文字が1つしかない場合、コンパイラはそれをputchar()に変換するように見えます。 printf( "ab")を使用して別の例を実行し、%ediレジスタのテキストセクションを使用してprintfを呼び出しました。

5
user5181136
  1. Putchar:構文が示すように、画面に1文字だけを出力します。
  2. Printf:画面上のprintf行またはWord。したがって、画面に1文字だけを表示する場合は、putcharを使用します。文字列を読み取るには、gets関数を使用します。文字列を表示するには、puts()またはprintfの両方を使用できます。
0
user3016508

質問されてから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 "

奇妙な?親と子の両方がfork()の前にあるputchar( 'a')を処理します!
そして、fork()の前に何百万ものputchar()を置くこともでき、それらはすべて親プロセスと子プロセスの両方によって実行されます。ただし、printfは影響を受けていません。
私はそれを理解してstackOverflowで探してみたところ、この質問が見つかりました。putchar()やprintfなど、バフについて何かがあると思います。どちらもバフを設定し、出会ったら文字列を出力します。\nしたがって、この状況では、子プロセスが親のバフをコピーするため、コードがロールバックされて前のputcharが実行されるように見えます。

0
Cooooookie

違いは、putcharは1文字を印刷するのに対し、printfはもっと多くの文字を印刷できることです。

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

通常、端末に何かを印刷するときは、改行文字'\n'で終了します。少なくともその理由から、printfを使用することをお勧めします。

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

の代わりに

putchar(c);
putchar('\n');
0
Tommy Ivarsson

printfを使用すると、整数や浮動小数点数などの文字列を置き換えて、複雑な方法で文字列をフォーマットできます。

getcharおよびputchargetおよびput文字

Printfは、putcharよりも多くの点で便利であると言えます。

ターミナルのそれぞれのマニュアルページ(man 3 printf man 3 putchar)をよく見てください。

0
jt25