• ベストアンサー

CTRL+Dでループを抜けるには

RedHatLinux7J環境でC言語のプログラミングを行っています。キーボードからCTRL+D(EOF)が入力されるまで、1文字入力しその文字コードを出力するプログラムです。 しかし、CTRL+Dを2回押さないと処理が終わりません。 これはなぜなのでしょうか。ご存知の方いらっしゃいましたらお願いいたします。 #include<stdio.h> main(){ int ch; while((c=getchar())!=EOF) printf("%d ",ch); putchar('\n'); }

質問者が選んだベストアンサー

  • ベストアンサー
  • Fooky
  • ベストアンサー率71% (59/82)
回答No.2

最初は「そんなことないだろう」と思ってたんですが,確かに入力行の途中でCtrl+Dを押したときは,リターンを押したときのようにそこまでの入力内容がフラッシュされるだけで,EOFにはならないですね. [a],[b],[c],[Ctrl+D]と押した場合  → abc97 98 99 私も知らなかったんですが,どうも行頭で押さないとCtrl+DはEOFにならないようです. キーボードバッファリングの仕様がこうなってるからどうしようも無いと諦めるか,あるいはバッファリングをせずに直で1文字ずつ取るか,どっちかですね. バッファリングをしないでキーボードから直接文字を取るにはcursesライブラリを使うのが簡単だと思います. #include <stdio.h> #include <curses.h> main() { int ch ; initscr(); while ( ( ch = getch() ) != 4 ){ printf("%d ",ch); refresh(); } printf("\n"); endwin(); } 4がCtrl+Dを表す文字コードです.initscr, getch, refresh, endwinがcursesのライブラリ関数です. コンパイルのときはcursesライブラリをリンクするのを忘れないで下さい.gccの場合↓ gcc test.c -o test -lcurses

maity
質問者

お礼

ありがとうございます!! Windows環境だとちゃんといくのに、Linuxだと駄目で 非常に悩んでおりました。 cursesライブラリについては全く知らなかったので 色々勉強してみます。 またよろしくお願いします!!!

その他の回答 (1)

  • arukamun
  • ベストアンサー率35% (842/2394)
回答No.1

Ctrl + Dで終了したいのですね。 #include <stdio.h> main() {   int ch ;   while ( ( ch = getch() ) != EOF ){     printf("%d\n",ch);   } } でいかがでしょうか。 getcharをgetchに変えただけです。 また、putchar('\n');もprintfに組み込んでしまいました。 もしかしたら #include <conio.h> を入れないとダメかもしれません。

関連するQ&A

専門家に質問してみよう