• ベストアンサー

コマンドプロンプトからのEOFの入力方法について

#include <stdio.h> main(){ int cnt[10]; int c; int i; for(i=0; i<10; i++){ cnt[i] = 0; } while((c=getchar())!=EOF){ if(c>='0' && c<='9'){ cnt[c-'0']++; } } for(i=0; i<10; i++){ printf("%d : %d", i, cnt[i]); } } という、キーボードから入力した数値の個数を 表示するプログラムを、VisualC++で、Win32consoleアプリケーションで作ったのですが、 コマンドプロンプトから何個かの数値を入力したあと、Enterキーを押しても 何の反応もありません。 キーボードから「EOF」を入力するにはどうすればよいのでしょうか。 または、どういう状態をEOFと言うのでしょうか。

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

くわしかないですが。 ・Windowsのコマンドプロンプトでも^Zで入力終了です #って違うことを訊いていたり? ・^ZはASCIIだと0x1aなのはその通りですが、getcharでそのキャラクタを 受け取るわけではありません。#3の回答にあるとおりです。 #(ストリームがバイナリの場合は別) ・テキストモードでファイルをオープンして読み込んでいる場合、 ・・データの中に0x1aがあってそこに到達した ・・ファイルの終端に到達した ときにEOFが返ってきます。

beterugius
質問者

お礼

ありがとうございました。

その他の回答 (3)

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.3

Ctrl + Z の入力がストリームの終端になるのは DOS の機能じゃなかったっけ? UNIX では Ctrl + D が入力の終了で Ctrl + Z は Stop シグナルになるでしょう。 また、getchar() で戻される EOF は (-1) のことで、文字コードとしての 0x1a とは違います。 誰か詳しい人いないかなぁ。

beterugius
質問者

お礼

ありがとうございました。

  • yaha_2007
  • ベストアンサー率21% (13/61)
回答No.2

EOFはファイルの終わりを示すため ファイル末尾に付く1byteのデータです。 何かファイルを用意して以下のようなプログラムで どんなデータがEOFとして使われてるか確認してみても 面白いかもしれません。 ------------------------------------- char dat; FILE fp; fp=fopen("filename","r"); fseek(fp, 0, SEEK_END); fscanf(fp,"%c",&dat); printf("%x",dat); -------------------------------------- ※確認とってないのであしからず^^

beterugius
質問者

お礼

ありがとうございました。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

Enterキーではなく 『Ctrl+Z』を入力してみましょう 入力終了という意味です 本来は『End of File』の略です 昔はテキストファイルの入力がこれで終わりですよといった識別子に 0x1Aを使っていました 0x1Aをマークとしてはほとんど使いません

beterugius
質問者

お礼

うまく動きました。 どうもありがとうございました。

関連するQ&A

  • 数字文字をカウントするプログラムの動作について

    良い質問のタイトルが思い浮かばず、分かりづらいタイトルで申し訳ありません、C言語について質問させて頂きます。 C言語の参考書を買って夏休み中にプログラムの勉強をしているのですが、何故動作するのかがわからない例があります、ソースは以下の通りです。 #include <stdio.h> int main(void) { int i,ch; int cnt[10] = {0}; while(1) { ch = getchar(); if (ch==EOF) break; switch(ch) { case '0' : cnt[0]++;printf("%d\n",ch);break;/* printfは確認の為 */ case '1' : cnt[1]++;printf("%d\n",ch);break; case '2' : cnt[2]++;printf("%d\n",ch);break; case '3' : cnt[3]++;printf("%d\n",ch);break; case '4' : cnt[4]++;printf("%d\n",ch);break; case '5' : cnt[5]++;printf("%d\n",ch);break; case '6' : cnt[6]++;printf("%d\n",ch);break; case '7' : cnt[7]++;printf("%d\n",ch);break; case '8' : cnt[8]++;printf("%d\n",ch);break; case '9' : cnt[9]++;printf("%d\n",ch);break; } } puts("数字文字の出現回数"); for(i=0;i<10;i++) printf("'%d':%d\n",i,cnt[i]); getchar();getchar(); return(0); } といったプログラムです。 実行し、数値を入力、CTRL+Zで入力を終了し、出現回数を表示させる、という動作自体は無事にできるのですが、何故chの値が変更していくのかがわかりません、数値を入力した時点で51や49といったそれぞれ違う数値が表示されるのですが、chの値を変更させる命令を、何が引き起こしているのかが理解できません、3(51)と判定されて同じ数が無限にカウントされないのは何故なのでしょうか・・・・? また、その後の無限ループからの脱出をCTRL+Zがどうして引き起こすのかも理解できず困っています、教科書には「CTRL+Zは入力の終了を意味する」とあるのですが、これは一体どういう意味なのでしょうか、強制的に割り込んでEOFを代入するということなのでしょうか・・・? お時間がある時にでも、教えて頂けると助かります、よろしくお願いします。

  • うまくいかないorz

    出てきたアルファベットをカウントするプログラムを作成したのですが、 うまくいきません。 #include<stdio.h> int main(void) { int kaisu[25]={0}; char c; int i; do{ i=(c=getchar())-'a'; //printf("%d\n",i); kaisu[i]++; }while(c=(getchar())!=EOF); for(i=0;i>=25;i++){ printf("%d\n",kaisu[i]); } return(0); } 一応、EOFで読み込みを終了させたいのですが。 ご伝授ください。

  • 標準ライブラリ関数で入力する時にEORが未定義と表示される

    #include <stdio.h> int main(void) { int i, c, counter[10] = {0}, n; printf("数字を入力してください。(終了条件:Ctrl+Z)\n"); while ((c = getchar()) != EOF) { n = c - '0'; if (n >= 0 && n <= 9) { counter[n]++; } } printf("\n入力した数字の個数\n"); for (i = 0; i < 10; i++) { printf("%d : %d個入力\t", i, counter[i]); } return 0; } 上のように入力した場合になぜかEORは未定義と表示されます・ これはどうしてなのでしょうか? この式でいけるはずなのですが。 よろしくお願いします。

  • キーボードからの入力・出力について

    ☆いつもお世話になります。☆ 下記のCのプログラムは、入力したものをそのまま表示します。 しかし、出力する直前の改行がされないんです。 #include <stdio.h> #include <string.h> int main(void) { char array[80] ; int c ; int s=0 ; printf("入力してください\n") ; for( ; ; ) { c = getchar( ) ; if ( c != EOF ) { array[s] = c ; s++ ; } else { array[s] = '\0' ; break ; } } putchar( '\n' ) ; /* ★この改行は?★ */ puts( array ) ; printf( "strlen(array)=%d\n", strlen(array) ) ; return 0 ; } キーボードから、 'A' 'B' 'C' 'D' 'E' 'F' 'G' 7文字の入力の後に コントロール+Z を入力します。 ----------------次のようになります。---------- 入力してください ABCDEFGABCDEFG strlen(array)=7 初めのABCDEFGはキーボードからの入力時に表示されたもので、 後のABCDEFGはputsで出力したものと思います。 私は2つのABCDEFGの間に改行が入るんじゃないかなあ~~と思うんですが、 なぜそうならないんでしょうか? VC++6.0でWin32 Console Applicationで作成しています。

  • EOFのエラーについて

    自分で考えてみたのですかどうもうまくいきません。 教えてください・ #include <stdio.h> int main () { int point[3][4]; int total[3]; int loop,loop1; for(loop1=0;loop1<3;loop1++) { for(loop=0;loop<4;loop++) { switch(loop1) { case 1:printf("A君\n");break; case 2:printf("B君\n");break; case 3:printf("C君\n");break; } printf("のゲーム%dの得点を入力してください\n",loop+1); printf("%d",&point[loop1][loop]); } } for(loop1=0;loop1<3;loop1++) { total[loop1]=0; for (loop=0;loop<4;loop++) { total[loop1]=total[loop1]+point[loop1][loop]; } printf("%4d",total[loop1]); } for (loop1=0;loop1<3;loop1++) { for(loop=0;loop<4;loop++) { printf("%4d",point[loop1][loop]); } printf("%4d",total[loop1]); } なんですがEOFのエラーと意味のわからない言葉でエラーがでるのですがいったいどうしたらいいんですか?

  • 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は何故出て来たのでしょうか?

  • 教えてください。

    標準入力から文字を入力し、その中の英小文字( a ~ z )の出現回数を文字ごとにカウントし、表示せよ。英小文字以外の文字は無視する。 という課題が出てうまく表示されません。 プログラムはこんな風です。 #include <stdio.h> int main(void) { int i,ch; int cnt[23] = {0}; while (1) { ch = getchar(); if (ch == EOF) break; switch (ch) { case 'a': cnt[0]++; break; ・      ・        ・   case 'z' :cnt[22]++; break; } } puts(" 英字の出現回数"); for(i=0;i<23;i++) printf("'%d': %d\n",i,cnt[i]) return 0; } で実行すると '0':4となってしまい'a'にしたいのですがどのようにかえればいいのでしょうか?

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

  • C言語プログラミングで・・・

    つい最近、C言語プログラミングのお勉強をはじめた中学生です。 ある程度かけるようになってきて、こちらのサイトに掲載されている練習問題を解いていました。 http://akabas.net/lib/CExercise.aspx いろいろといていく中で、配列の章にはいりました。 配列の章の中の6問目と7問目の九九についてのコードを書いていたところ、どちらも問題なく実行を終了した後 「○○.exeは動作を停止しました。」というメッセージが現れました。 これはコードに何か問題があるのでしょうか? _____________________________________________________________________ //6問目 #include <stdio.h> void line (void){ int cnt; for (cnt = 0; cnt < 30; cnt++) printf("_"); printf("\n"); } int main() { int kuku[9][9], i, j; printf("九九を表示します\n"); for (i = 1; i <= 9; i++){ for (j = 1; j <= 9; j++){ kuku[i][j] = i * j; printf("%d * %d = %d\n", i, j, kuku[i][j]); } line(); } return 0; } ____________________________________________________________________ //7問目 #include <stdio.h> int main() { int kuku[9][9]; int i, j; for (i = 1; i <= 9; i++){ for (j = 1; j <= 9; j++) kuku[i][j] = i * j; } printf("1桁の数値(1 ~ 9に限定)を入力してください 1回目---"); scanf("%d", &i); printf("1桁の数値(1 ~ 9に限定)を入力してください 2回目---"); scanf("%d", &j); printf("\n"); printf("%d * %d = %d", i, j, kuku[i][j]); return 0; } ________________________________________________________________________________ まだ初心者のレベルなので、回答はできたらきつい言葉をつかってほしくないです^^; よろしくおねがいします ※こちらでは、Tabをうっているのですが、表示されてないみたいです。見づらいかと思いますが、よろしくおねがいします

  • ファイル入力方法

    いつもお世話になります。C言語のファイル入力について教えてください。 入力ファイルinput.txtの内容が以下の時、 ----------- abcdefg ----------- 2 3 5 6 3 8 1 7 ----------- ABCDEFG ----------- (1)最初の3行を無視する (2)4行目からの数値データを配列に格納する (3)数値データは最大100行、2列固定 (4)8行目の-----------以降は無視する 以上の条件でプログラムを作成したいのです。(1)(2)(3)の条件は下記のソースコードに入っていますが、(4)の処理の仕方がわかりません。 申し訳ありませんが、教えてください。よろしくお願いします。 #include <stdio.h> #include <stdlib.h> int main() { int i,cnt=0,N=0,a[100],b[100]; char s[256]; FILE *fpi; if((fpi=fopen("input.txt","r"))==NULL){ fprintf(stderr,"ファイルを開けません\n"); exit(1); } while(fgets(s,256,fpi) != NULL){ //printf("%s",s); cnt++; if(cnt>3){ sscanf(s,"%d %d",&a[N],&b[N]); N++; } } printf("データ行数:%d\n\n",N); for(i=0;i<N;i++){ printf("%d %d\n",a[i],b[i]); } fclose(fpi); return 0; }

専門家に質問してみよう