• ベストアンサー

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'); }

  • maity
  • お礼率50% (38/75)

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

  • ベストアンサー
  • 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

  • getcharの働きについて

     1文字入出力関数getchar()、putchar()の働きを調べるため、次のソースを作って動かしてみました。'>'を使って、実行結果をテキストファイルに出力してみました。 ★ソース1(□はタブ) ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ #include <stdio.h> #include <stdlib.h> int main(void) { □int ch; □printf("何か文字を入力して下さい。\n"); □printf("(Ctrl+Zが入力されたら終了します。)\n"); □while ((ch = getchar()) != EOF) □□putchar(ch); □ □return EXIT_SUCCESS; } ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ ★実行結果 ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ 何か文字を入力して下さい。 (Ctrl+Zが入力されたら終了します。) a abcde ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆  上のように、遊びで文字列を入力してみましたところ、1文字と同様に、入力したとおりに出力されました。そこで、入力したものを確認するために、printf()で出力する行を一つ次のように入れましたところ、次の実行結果のようになりました。 ★ソース2(□はタブ) ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ #include <stdio.h> #include <stdlib.h> int main(void) { □int ch; □printf("何か文字を入力して下さい。\n"); □printf("(Ctrl+Zが入力されたら終了します。)\n"); □while ((ch = getchar()) != EOF) □□printf("入力は%c\n", ch); □□putchar(ch); □ □return EXIT_SUCCESS; } ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ ★実行結果 ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ 何か文字を入力して下さい。 (Ctrl+Zが入力されたら終了します。) 入力はa 入力は 入力はa 入力はb 入力はc 入力はd 入力はe 入力は  ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆  getchar()で上のように文字列を入力した場合、異常終了にはならないのでしょうか。また、2バイト文字('あ')とか、その文字列("あいうえお")を入力して実行してみましたが、異常にはなりませんでした。getchar()に文字列を入力した場合、どのように処理されるのでしょうか。実用的ではないかもしれませんが、コンピュータの動きをちゃんと理解したいと思いますので、よろしくお願い致します。

  • 2つのプログラムの違い

    どうしても分からなかったので投稿しました。よろしくお願いします。 #include<stdio.h> int main(void) { int c; while((c=getchar())!=EOF){ putchar(c); } return 0; } のプログラムをコマンドプロンプトで入力すると、 abc abc なんですが、 #include<stdio.h> int main(void) { int c,i; i=0; while ((c=getchar())!=EOF) { putchar(c); i++; printf("%d\n",i); } return 0; } の場合、 abc a1 a2 a3 4 になります。 自分は abc a1 a2 a3 になると思ったのですが、a3と4の隙間と4は何故出て来たのでしょうか?

  • MinGWのC言語でCTRL+Zで処理が終了しない

    C言語をMinGWで学習していますが、以下のコードでCTRL+Zで処理が終了しません。お教え下さい。 #include <stdio.h> int main(void) { int ch; while ((ch = getchar()) != EOF) putchar(ch); return 0; } 端末エミュレータはminttyで、OSはWindws xp sp3です。ちなみにMinGW shellで実行するとCTRL+ZとEnterで処理が終了します。

  • 困っています

    文字列を逆順にするプログラムを考えているのですが分かりません。(例)qwerならrewqです。入力終了は、EOFです。途中まで考えたのですが、分かりません。教えてください。宜しくお願いします。 #include <stdio.h> char str(30); printf("文字列を入力") while (1) { ch=getchar(); if (ch==EOF) break;

  • 置き換えのプログラム

    c言語初心者です。 入力されたタブを\tに置き換えて、入力全体を出力するプログラムを、 #include <stdio.h> main() { int c; while((c=getchar())!=EOF){ if(c=='\t') printf("\\t");   putchar(c); } } と書いて実行できたのですが、入力した文字(タブ、空白、改行などは除く)を¥(バックスシュラッシュ)に置き換えて出力するプログラムにするためには、どのように書き換えればよいのでしょうか? どなたかご教授お願いします。

  • toupperに関して

    C言語初心者です。 勉強のために本に書いてあるものを写しながら勉強しているのですが、 #include <stdio.h> #include <ctype.h> int main() { int c; while ((c=getchar())!=EOF){ c=toupper(c); putchar(c); } } 以上のものを写したのですが、入力した文字が小文字であろうと大文字であろうと関係なくそのまま表示されます。 どこを間違えているのでしょうか? どうぞよろしくお願いいたします。

  • C言語

    文字列を逆順にするプログラムを考えているのですが分かりません。(例)qwerならrewqです。入力終了は、EOFです。考えたのですが、分かりません。(コンパイルエラーです。)教えてください。宜しくお願いします。#include <stdio.h> unsigned str_length(const char str[]) { unsigned len=0; while (str[len]) len++; return (len); } void put_rstring(const char str[]) { unsigned i = str_length(str): while (i-- >0) putchar(str[i]); } int main(void) { char str[30]; int ch; printf("文字列を入力\n"); /* ----この文字列を入力したあとに、Ctrl+Zを押すと、逆から表示               で反対から、文字列が表示----*/ while (1) { ch=getchar(); if (ch==EOF) break; } printf("逆から表示"); put_rstring(str); puts("です。"); return(0); }

  • WindowsでEOF

    簡単な質問で恐縮ですが、現在WindowsでVC++2010Expressでコードを書いています。 そこで、以下の様な入力文字数を返すコードを書いているのですが、コマンドプロンプト上でCtrl+Z(Ctrl+Dも試した)を押してもストップしてくれません。(コマンドプロンプト上に「^Z(^D)」と表示されるだけです。 どなたか教えて頂けませんでしょうか? #include <stdio.h> int main() { int strText; int counter=0; while( (strText=getchar() ) != EOF){ ++counter; } putchar(counter); return 0; }

  • 文字カウンタ

    英語の文章中で、二文字単位で読み取って、その文字列の数を出力しようと思っています。 例 hello hey you → he:2 ll:1 o :1 y :1 yo:1 u :1 解析に用いるのは、C言語でなくても、エクセルでもUNIXコマンドでも構いませんが、とりあえず、文字をカウントしたいです。 C言語での文字カウンタを作ってみたのですが、一文字単位で読みとるものしか作れませんでした。 #include <stdio.h> #include <ctype.h> int main( void ) { int ch, i; int alpcnt[26] = {0}; printf( "文字を入力\n" ); while ( ( ch = getchar( ) ) != EOF ) { if ( isupper( ch ) != 0 ) { alpcnt[ch-'A']++; } else if ( islower( ch ) != 0 ) { alpcnt[ch-'a']++; } } for ( i = 0;i < 26; i++ ) { printf( "%c : %3d個入力\t\t", 'a'+i, alpcnt[i] ); if ( i%3 == 2 ) putchar( '\n' ); } return 0; } これを少し改造するだけで作れますでしょうか? 宜しくお願いします。

  • C初心者です。どうかお助けを

    独習Cという本で独学中なのですが #include<stdio.h> int main() { int a,b; char ch; printf("実行したい演算は\n"); printf("加算(A)、減算(S)、乗算(M)、除算(D)のどれですか\n"); do{ printf("アルファベットの1文字を入力してください:"); ch=getchar(); while(getchar()!='\n'); }while(ch!='A' && ch!='S' && ch!='M' && ch!='D'); printf("\n"); printf("最初の数字を入力してください:"); scanf("%d",&a); printf("二つめの数字を入力してください:"); scanf("%d",&b); switch(ch){ case 'A': printf("%d",a+b); break; case 'B': printf("%d",a-b); break; case 'C': printf("%d",a*b); break; case 'D': if(b!=0)printf("%d",a/b); } return 0; } このプログラムでの14行目の while(getchar()!='\n');の必要性がわかりません。 どなたか有識者の方の回答をお願いします。

専門家に質問してみよう