アプリ版:「スタンプのみでお礼する」機能のリリースについて

RedHatLinux7J環境でC言語のプログラミングを行っています。キーボードからCTRL+D(EOF)が入力されるまで、1文字入力しその文字コードを出力するプログラムです。
しかし、CTRL+Dを2回押さないと処理が終わりません。
これはなぜなのでしょうか。ご存知の方いらっしゃいましたらお願いいたします。

#include<stdio.h>
main(){
int ch;

while((c=getchar())!=EOF)
printf("%d ",ch);

putchar('\n');
}

A 回答 (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
    • good
    • 0
この回答へのお礼

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

またよろしくお願いします!!!

お礼日時:2003/05/22 23:58

Ctrl + Dで終了したいのですね。



#include <stdio.h>

main()
{
  int ch ;
  while ( ( ch = getch() ) != EOF ){
    printf("%d\n",ch);
  }
}

でいかがでしょうか。
getcharをgetchに変えただけです。
また、putchar('\n');もprintfに組み込んでしまいました。
もしかしたら
#include <conio.h>
を入れないとダメかもしれません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!