• 締切済み

c言語 scanf

下のソースを実行したらおかしなことになったんですがなんででしょうか?? #include<stdio.h> int main(void){ int i; char c[1000]; for(i=0;;i++){ printf("文字>>>>"); scanf("%c",&c[i]); printf("result = %c \n",c[i]); } } ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓実行↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 文字>>>>a result = a 文字>>>>result = 文字>>>>b result = b 文字>>>>result = 文字>>>>c result = c 文字>>>>result = 文字>>>>d result = d 文字>>>>result = 文字>>>>^C

みんなの回答

  • Z_RX8_FR
  • ベストアンサー率81% (9/11)
回答No.5

下記の説明が解りやすいかなと思います。 http://ja.wikipedia.org/wiki/Scanf

tomato1414
質問者

お礼

わざわざありがとうございます! ちょっと見てみます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

入力ストリームに対して fflush しちゃダメ>#2. scanf("%c%*[^\n]\n", &c[i]); で動く, かも.

tomato1414
質問者

お礼

アドバイスありがとうございます! 試してみたけどうまくは動きませんでした。 最初はうまく行きそうな感じだったんですが。あと、 %*[^\n]←これは何をしてるんですか?

  • notnot
  • ベストアンサー率47% (4846/10257)
回答No.3

>なんでcanf文を実行するとループが二回されるのが意味がわからないです 一回目、a を読み取り 二回目、Enter を読み取り 三回目、b を読み取り ・・・・と動いています。 1回のEnter入力で、プログラムでも1回読んだことにしたいとすると、 #include <stdio.h> int main(void){ int i; char c[1000]; char in[100]; /* 適当な大きさ */ for(i=0;;i++){ printf("文字>>>>"); fgets(in,sizeof in,stdin); c[i] = in[0]; printf("result = %c \n",c[i]); } } 端末からの読み取りには、scanfじゃなくてfgetsを使います。 in[0] に 'a'、in[1] に Enter('\n')、in[2] に NUL('\0') が入ります。

tomato1414
質問者

お礼

なるほどです!納得行きました。 scanfはエンターを二文字目として読んでただけなんですね。 あとfgetsを使ったらうまくいきました。 どうもありがとうございました。

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.2

これはちょっと厄介な問題です。 C言語の仕様と現実のハード(キーボード)の間に矛盾があるのです。 scanfではabcdefを期待しているのですが キーボードではa enter b enter ・・・という風に入力しないとCPUに送られません。 CPUは enter も1文字として受け取ってしまいますので上記のようになります。 邪道ですが「fflush(stdin)」で入力バッファークリアー(つまりenterの読み飛ばし)をはさめばうまく行くでしょう。 あくまでも正道ではありません。  

tomato1414
質問者

補足

なるほどです!まさかenterまで読まれてたとは思ってなかったですね。。 fflushは知らなかったんで、覚えて使えるようにしときます^^ どうもありがとうございました!

  • notnot
  • ベストアンサー率47% (4846/10257)
回答No.1

a Enter b Enter c Enter d Enter とキーを押しているならそれで正常です。 文字とEnter(改行)が、交互に出力されています。 どういう動作を期待しているかによって、プログラムを書き換える必要があります。

tomato1414
質問者

補足

早い回答ありがとうございます。 これは正常なんでしょうか?? 期待した処理は 文字>>>>a result = a 文字>>>>b result = b 文字>>>>c result = c 文字>>>>d result = d 文字>>>>^C です。つまり、dを入力したときi=3となるようにしたいんです。 なんでcanf文を実行するとループが二回されるのが意味がわからないです

関連するQ&A

  • scanf()関数の使い方について

    はじめまして。 質問があります。 まずは、以下のコードを見てください。 ---------------------------------------------------------------- #include<stdio.h> int main(void) { char c; int i; printf("0を入力すると終了します。\n"); while(1) { printf("文字を入力してください=>"); scanf("%c",&c); printf("入力した文字は %c です。\n",c); printf("数字を入力してください=>"); scanf("%d",&i); if(i==0) { break; } printf("入力した数字は %d です。\n",i); } return 0; } ---------------------------------------------------------------- 上のコードを実行すると、初回はscanf()はcharとintの両方とも 入力待ちになってくれるのですが、2回目以降はcharは入力待ちに なってくれません。これは、なぜなのでしょうか? ご教授お願いします。 現在VC++6.0を使用しております。

  • C言語でscanf()が先に実行されるのはなぜですか?

    C言語でscanf()が先に実行されるのはなぜですか? #include <stdio.h> int main(void){ int intNum; printf("整数を入力してください:\n"); scanf("%d", &intNum); printf("入力値は:%d\n",intNum); return(0); }

  • c言語についての質問です。

    #include<stdio.h> int main(void){ int a; printf("1文字たいぷしてください。\n"); scanf("%d",&a); if(a>=65 && a<=90){ printf("大文字です。\n"); } else if(a>=97 && a<=122){ printf("小文字です。\n"); } else{ printf("大文字でも小文字でもありません\n"); } return 0; } このプログラムは正しくなくて、 intをchar %dを%cにかえなければなりません。 なぜintはダメなんでしょうか? できれば丁寧に教えてください。 お願いします。

  • scanf文がうまくいかないのですが・・・

    下のようなプログラムを実行するとうまくいかないのですが、何故なのでしょう。 どうかお教えください。 #include<stdio.h> int main(void) { int i; char n; for(i = 0; i < 10; i++) { printf("nを入力してください>>>"); scanf("%c",&n); printf("%c\n",n); } return 0; }

  • C言語の初歩的な質問

    質問1----------------------------------------- #include<stdio.h> int main() {  int a;  char b[10];  for(int i = 0;i < 2;i++){   scanf("%d",&a);   printf("整数%d\n",a);  }  scanf("%s",b);  printf("文字列%s\n",b); } /* この際に、例えばabと入力すると結果が 整数-858993460 整数-858993460 文字列ab となり整数入力を無視して進められるのはなぜでしょうか? */ 質問2----------------------------------------- #include<stdio.h> void func(int**); int main() {  int *p;  func(&p);  printf("%d",*p); } void func(int **pp) {  int n = 10;  *pp = &n; } /* func関数のnはスコープからはずれて変数の寿命がなくなるはずなのにprintfで表示されるのはなぜでしょうか? */ ---------------------------------------------- C言語は一冊の本とネットの入門サイトをかじった程度の理解です。

  • C言語 ソートについて

    #include <stdbool.h> #include <stdio.h> void swap(char *a, char *b) { } bool is_at(char c) { } void justify(char line[], int n) { } int main(void) { char line[] = "a@b@@@c@@d@@@ef@@g"; size_t n = sizeof(line) - 1; justify(line, n); printf("%s\n", line); return 0; } 上の雛形を使って文字列lineに含まれる@以外の文字を文字列の前の方に詰めていくプログラミングを作るという問題を解いていたのですが下のプログラミングまでは出来たのですが最後のjustifyの部分がわかりません 良ければ解答をお願いします #include <stdbool.h> #include <stdio.h> void swap(char *a, char *b) { char temp = *a; *a = *b; *b = temp; } bool is_at(char c) { if(c == '@') { return true; } else { return false; } } void justify(char line[], int n) { for(int i=0;i<n-1;i++) { } } int main(void) { char line[] = "a@b@@@c@@d@@@ef@@g"; size_t n = sizeof(line) - 1; justify(line, n); printf("%s\n", line); return 0; }

  • for文,scanfについて

    以下のプログラムを実行したのですが #include<stdio.h> #include<math.h> main(){ int i,b=5; char c; for(i=0;i<=9;++i){ printf("%d\n",b); scanf("%c",c);←入力は自由 } return 0; } 結果 | 予想 5  |  5 a   |  a 5  |  5 5  |  a a   |  5 5  |  a 5  |  5 a   |  a と予想と違う結果が繰り返されるんですが なぜか分かりません。アドバイスを頂けな いでしょうか?

  • scanf が無視されます

    例えば下のようなプログラムを実行するとmain関数の scanf が無視 されてしまいますが何故なのでしょうか。コンパイラはLSI C-86試食版です。 ----------------------------- #include <stdio.h> int main ( ) ; void aa ( ) ; int main ( ) { int i ; aa ( ) ; printf ( " input i. \n " ) ; scanf ( " %d ", &i ) ; printf ( " i = %d\n ", i ) ; } void aa ( ) { int x, y ; while ( scanf ( " %d ", &x ) ! = EOF ) { y = x ; printf ( " y= %d\n ", y ) ; } } --------------------------------

  • C言語 構造体の並び替え 

    #include<stdio.h> typedef struct{ char mozi[10]; char namae[30]; }PE; void input_profile(PE *p,int *a); void printf_profile(PE *p,int *a); int main(void) { int i=0; PE c[999]; input_profile(c,&i); return 0; } void input_profile(PE *p,int *a){ int c,b; for(b=0;999>b;b++) { printf("名前を入力\n"); scanf("%s",(p+b)->namae); printf("文字を入力\n"); scanf("%s",(p+b)->mozi); printf("入力を終えるなら0を入力してください\n続けるなら、それ以外の数字を入力してください\n"); scanf("%d",&c); if(c==0)break; } b++; *a=b; printf_profile(p,a); } void printf_profile(PE *p,int *a) { int b; for(b=0;*a>b;b++) { printf("NO%d\n",b+1); printf("文字%s\n",(p+b)->mozi); printf("名前%s\n",(p+b)->namae); } } このプログラムを 自分で関数を作って データ一覧をmoziのアルファベット順に表示するように書きなおしたいんですけど どうなるのでしょうか? どうか教えてください

  • C言語の初心者です。これを実行してみてください。

    「a」って打ち込んだら「a」ってでましたか? #include<stdio.h> int main(void){ char a; printf("aaa\n"); scanf_s("%c", &a); printf("%c", a); return 0; }

専門家に質問してみよう