私は現在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つの間でどちらを使用するのが良いですか?
printf
は、100の異なるフォーマット指定子で機能し、適切な結果文字列を出力する汎用の印刷関数です。 putchar
は、まあ、画面に文字を配置します。それはまたそれがおそらくはるかに速いことを意味します。
質問に戻る:putchar
を使用して1文字を印刷します。繰り返しますが、おそらくはるかに高速です。
Printf( "a")と-Sを使用して例をコンパイルし、アセンブリコードでputcharを呼び出しました。 printfに文字が1つしかない場合、コンパイラはそれをputchar()に変換するように見えます。 printf( "ab")を使用して別の例を実行し、%ediレジスタのテキストセクションを使用してprintfを呼び出しました。
質問されてから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が実行されるように見えます。
違いは、putchar
は1文字を印刷するのに対し、printf
はもっと多くの文字を印刷できることです。
printf("%s\n", "this is a lot longer than one character");
通常、端末に何かを印刷するときは、改行文字'\n'
で終了します。少なくともその理由から、printf
を使用することをお勧めします。
printf("%c\n", c);
の代わりに
putchar(c);
putchar('\n');
printfを使用すると、整数や浮動小数点数などの文字列を置き換えて、複雑な方法で文字列をフォーマットできます。
getcharおよびputchargetおよびput文字
Printfは、putcharよりも多くの点で便利であると言えます。
ターミナルのそれぞれのマニュアルページ(man 3 printf man 3 putchar)をよく見てください。