getchar()とscanf("%c",ch)のEOFで終了を判断する際の違い

2003 ワード

1、getchar()
#include <stdio.h>

int main() {
    int c;

    while((c = getchar()) != EOF)
        putchar(c);

    return 0;
}

helloを入力して車に戻ると、出力結果は次のようになります.
hello
hello

i.このときctrl+Z(すなわちWindows下のEOF表示)を入力し、プログラムを終了する.
     ii.helloを入力してから折り返しではなくEOFを入力した場合、プログラムは終了せずに入力を続行できますが、改行はありません.
これは、getchar()が入力バッファからデータを読み出す場合、EOF値が第1の位置にある場合or読み出しエラーの場合にのみ、EOF値が返されることを意味します.たとえば、「hello(Ctrl Z)リターン」と入力すると、プログラムは終了しません.(Ctrl Z)は第1の位置にありません.「(Ctrl Z)helloリターン」と入力すると、ループが飛び出します.
【The return value is EOF for an error or if the end-of-file character or the end-of-string character is encounteredin the first attempt to read a character.】
2. scanf("%c", &ch)
#include <STDIO.H>

int main()
{
    char ch;

	while(scanf("%c", &ch) != EOF) {
		printf("%c",ch);
	}

    return 0; 
} 

Windows XPシステムでVC++6.0でテストしたのですが、「(Ctrl Z)helloリターン」と入力した場合、プログラムは終了しませんでした.「Ctrl Z」と複数回のリターンを押しても、終了しません.ちょっと変な感じがします.でも、
「(Ctrl Z)リターン(Ctrl Z)」を押すとループから飛び出します.
MSDNを調べてみましたが、以下のように抜粋して、あまり詳しく紹介されていません.このような状況がはっきりしているものがありますので、説明してください.
【The return value is EOF for an error or if the end-of-file character or the end-of-string character is encountered in the first attempt to read a character.】3、scanfのフォーマット入力
%d,遭遇数字,'+','-'以外の文字が終了し,スペース%f,,%lf:遭遇数字,'.','e','+','-'以外の文字は終了し、スペース%sをスキップすることができ、最初の非スペース文字から次のスペースまで終了する.%c、文字に出会ったら値をつけます.スペースでもリターンでも. 
プログラムにこのようなコードが現れたら、scanf("%d,%s,%c,%c).プログラムは','で区切られていますが、%sはこれを認識していません','のもので、スペースだけを認識しているので、変数が正しく値を付与できない場合があります.もしあなたが','を削除しても、%cはスペースに遭遇してもスキップしないので、必要を満たすことはできません.上の私たちは知っています.%cがスペースに遭遇してもスキップしません.だから、私は次のように解決します.%cの前にスペースを追加して処理すると、上記のすべての問題を解決することができます.だから、%cを使用するときは、前にスペースを追加しなければなりません.この習慣を身につけると、面倒を省くことができます.%cを使用する前にfflush(stdin)を追加したほうがいいです.キャッシュをクリアするために使用します.