• ベストアンサー

標準ライブラリ関数で入力する時に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は未定義と表示されます・ これはどうしてなのでしょうか? この式でいけるはずなのですが。 よろしくお願いします。

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

  • ベストアンサー
noname#39970
noname#39970
回答No.2

EOFなら stdio.h に定義されてる となっている。 stdio.h を開き #define EOF ~~~ という行が存在するか確認する。 存在しない場合は EOFに相当する物を手で宣言する。 これは使用してるコンパイラやライブラリ群の性質によって変るが一般的には「-1」となっている模様 #define EOF -1

sheran
質問者

補足

早急な回答ありがとうございます。 無事解決できました。 それでですが、#define EOF-2でも実行してみたのですが、 #define EOF-1と同じような結果になりました。 しかし、プログラムを組んで行く上でこのような違いは 実行結果に違いとして出てくるのでしょうか? よろしくお願いします。

その他の回答 (2)

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.3

EOFマクロはC/C++言語標準ですから定義されてないってのはおかしいです。 コンパイラは何かわかりませんが、多分何か別原因があるはずです。 > しかし、プログラムを組んで行く上でこのような違いは > 実行結果に違いとして出てくるのでしょうか? EOFの値は負数としか規定が無いので、ライブラリの提供する値を使ってください。 ライブラリが提供する値と異なる値を使うと、実行時に正常に動かない可能性があります。

sheran
質問者

お礼

そーなんですか。 ならEOF-1で常時表示するようにします・ 回答ありがとうございました。 また質問時にはよろしくお願いします。

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.1

とりあえず、そのまま貼り付けると動かしてませんがコンパイルは通りますね。(VC7.1sp1) > 上のように入力した場合になぜかEORは未定義と表示されます・ ちゃんと見てませんが、単に「EOF」と「EOR」のtypo(打ち間違い)というオチでは?

sheran
質問者

お礼

回答ありがとうございます。 EOFに関してはちゃんと表示されてました。 EOFの宣言が出来ていなかったために通らなかったみたいです。 宣言した後は無事通りました。 ありがとうございました。 また質問することがあればよろしくお願いします。

関連するQ&A

  • C言語・標準入力でquitを入力で終わるプログラム

    C言語標準入力でquitを入力で終わるプログラムを作っているのですが うまくいきません #include <stdio.h> int main(void) { int i, n; double data[100]; printf("数字を入力してください。\n"); printf("入力を終えるときにはCtrl-dを押してください。\n"); n = 0; while (scanf("%lf", &data[n]) != EOF) { n++; } for (i=0; i<n; i++) { printf("data[%d] = %f\n", i, data[i]); } return (0); } と今はとりあえづ作ってみたのですが 今のままではCtrl-dでループから抜ける形になっています strcmp関数を使うとは思うのですが strcmp関数はchar型なのでエラーが出てしまいます; このやり方じゃないchar型にしてやり直さないといけないでしょうか; Linux CentOS gcc でやっています 標準入力で数字を入力しそれを格納 quitを入力するまで繰り返す quitを入力で終了、これまで格納していた文字列の表示 簡単なプログラムの流れとしては上記の感じです よろしくお願いします。

  • うまくいかない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で読み込みを終了させたいのですが。 ご伝授ください。

  • c言語 スタックの標準入力の課題です

    c言語のスタックについての質問です。 実装したのですが、標準入力の部分を i 9 o i 8 i 7 o i 6 i 5 o i 4 o o i 3 i 2 i 1 o o e といったように指示を一括してやるために直す方法を教えていただきたいです。 iはプッシュ oはポップ eは終了 sは入力時点でのスタックに格納された全体の内容表示 となってます。 #include<stdio.h> #define MaxSize 100 //スタックサイズ int stack[MaxSize];//スタック int sp;//スタックポインタ int push(int); int pop(int *); void show_stack(); void main(void) { int c,n; while(printf("]"),(c=getchar())!=EOF){ rewind(stdin); if(c=='i'||c=='I'){ printf("data--> "); scanf("%d", &n); rewind(stdin); if(push(n)==-1){ printf("スタックがいっぱいです\n"); } } if(c=='o'||c=='O'){ if(pop(&n)==-1) printf("スタックは空です\n"); else printf("stack data-->%d\n",n); if(c=='e'||c=='E') break; } if(c=='s'||c=='S') show_stack(); } } int push(int n)//スタックにデータをつむプッシュ { if(sp<MaxSize){ ++sp; stack[sp]=n; return 0; } else return -1; } int pop(int *n) { if(sp>0){ *n=stack[sp]; sp--; return 0; } else return -1; } void show_stack() { int i; puts("スタックの内容"); if(sp<0){ printf("スタックは空です。\n"); } else for(i=sp;i>=1;i--) { printf("%11d\n",stack[i]); printf("\n"); } }

  • 標準ライブラリ関数と標準入力を使ったプログラミング

    C言語で「入力された数字をASCIIコードとして文字で出力する」というプログラムを作っています。 isdigitを使って入力が数字だったら値を出力して、それ以外のときはエラーメッセージが出力されるようにしたいのですが上手く動作しません。 以下が作ったプログラムなのですが。 #include<stdio.h> #include<ctype.h> int main(void) { int=a; scanf("%d",&a); if(isdigit(a))printf("%c",a); else printf("エラーです"); return 0; } isdigitの使い方がいまいちよく分かってないのともしかしたら根本的に何か大きく違ってるのかもしれないのですが何か助言等あれば頂きたいので宜しくお願いいたします。

  • getchar()について 教えてください。

    visual studio 2010 professinalで以下のソースをデバッグして ”続行するには何かキーを押してください!”  で待機させたいのですが getchar()一個だけでは実現しません。   2個重ねるとOKです。どうしてでしょうか。  -------------- 以下のようにscanf関数がなければokということは突き止めたのですが、、、。  ご教授ください。 #include <stdio.h> int main(void) { int i; printf("なにか数字を入力してください。\n"); scanf("%d",&i); printf("今あなたが入力した数字は%dです。\n",i); printf("続行するには何かキーを押してください!"); getchar(); //getchar(); return 0; } ---------------------------------------------------------------- int main(void) { printf("続行するには何かキーを押してください!"); getchar();   return 0; }

  • コマンドプロンプトからの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と言うのでしょうか。

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

  • 【C言語】入力された文字種別ごとにカウント

    以下のように実行したいのですが、 どのように組んだら良いのでしょうか? 宜しくお願いします。 言語はC言語で、環境はVisual C++ 2010 Express Editionを使っています。 ちなみに最後の方に現在のコードがあります。 ///////////////////////////////////////////// 文字を入力しなさい(終了条件:Ctrl+Z) abcdef678ABCDEFopuKLH ghtJK+ghjBBBdgjk ^Z a : 1個入力 b : 1個入力 c : 1個入力 d : 2個入力 e : 1個入力 f : 1個入力 g : 3個入力 h : 2個入力 i : 0個入力 j : 2個入力 k : 1個入力 l : 0個入力 m : 0個入力 n : 0個入力 o : 1個入力 p : 1個入力 q : 0個入力 r : 0個入力 s : 0個入力 t : 1個入力 u : 1個入力 v : 0個入力 w : 0個入力 x : 0個入力 y : 0個入力 z : 0個入力 A : 1個入力 B : 4個入力 C : 1個入力 D : 1個入力 E : 1個入力 F : 1個入力 G : 0個入力 H : 1個入力 I : 0個入力 J : 1個入力 K : 2個入力 L : 1個入力 M : 0個入力 N : 0個入力 O : 0個入力 P : 0個入力 Q : 0個入力 R : 0個入力 S : 0個入力 T : 0個入力 U : 0個入力 V : 0個入力 W : 0個入力 X : 0個入力 Y : 0個入力 Z : 0個入力 /////////////////////////////////////// #include <stdio.h> #include <conio.h> #define ALPHABET_COUNT 52 int main(void) { // 入力アルファベットの個数を数えるカウンタは大きさ 52 の配列で用意。 int counter[ALPHABET_COUNT]; int c; int i; // 最初に、配列の 52個の要素すべてを0クリアする for(i=0;i<52;i++){ counter[i] = 0; } printf("文字を入力しなさい(終了条件:Ctrl+Z)\n"); while(1){ c = getchar(); if(c == EOF){ break; } if(c >= 'a' && c <= 'z'){ //65<90 counter[c-'a']++; } else if(c >= 'A' && c <= 'Z'){ //97<122 counter[c-'A']++; } } // 文字種別の個数表示する c = 'a'; for(i=0;i<ALPHABET_COUNT;i++){ if(i<26){ printf("\t%c : %3d個入力",c++,counter[i]); if(((i+1)%3) == 0){ printf("\n"); } } else{ if(i==26){ printf("\n"); c = 'A'; } printf("\t%c : %3d個入力",c++,counter[i]); if(((i+2)%3) == 0){ printf("\n"); } } } printf("\n"); /* c = 'a'; for(i=1;i<=26;i++){ printf("\t%c : %3d個入力",c++,counter[i-1]); if(i%3 == 0){ printf("\n"); } } printf("\n"); */ }

  • C言語 エラー表示 break の位置が誤っている(関数 main ) 

    #include<stdio.h> int main(void){ int n,i,j,k; char c='*'; printf("正の整数:"); scanf("%d",&n); if(n>0){ for(i=1;i<=n;i++){ printf("%d",i); for(j=1;j<=n+1-i;j++){ if(j==1){ if(i-1>0){ for(k=i-1;k>0;k--){ printf(" "); } } } printf("%c",c); } printf("\n"); } } break; return 0; } これをコンパイルすると「break の位置が誤っている(関数 main )」と表示されるのですが何でですか? 困ってます↓

  • Cのgetcharについて

    Cの文字取得についての質問です。 #include <stdio.h> main() { int a,b,c,d; b=0; printf("1~10の間で数字を入力してください。\n"); scanf("%d",&a); printf("%dで処理します。\nよろしいですか?\nはい:y いいえ:n\n",a); c=getchar(); この場合getcharで文字を取得することができません。 というかenterを押して次に進んだようになってしまいます。ですがc=getchar();を2回繰り返すと文字を取得できます。 1回だと文字取得できなくて2回繰り返すと文字を取得できる理由が知りたいです。 scanfを最初に行っている事が絡んでると思うのですが 具体的な理由を教えてください。