dポイントプレゼントキャンペーン実施中!

下のソースを実行したらおかしなことになったんですがなんででしょうか??


#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

A 回答 (5件)

>なんで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') が入ります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/11/27 02:06

下記の説明が解りやすいかなと思います。



http://ja.wikipedia.org/wiki/Scanf
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/11/30 00:36

入力ストリームに対して fflush しちゃダメ>#2.


scanf("%c%*[^\n]\n", &c[i]);
で動く, かも.
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/11/27 02:17

これはちょっと厄介な問題です。


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

この回答への補足

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

補足日時:2009/11/27 02:08
    • good
    • 0

a Enter b Enter c Enter d Enter とキーを押しているならそれで正常です。


文字とEnter(改行)が、交互に出力されています。

どういう動作を期待しているかによって、プログラムを書き換える必要があります。

この回答への補足

早い回答ありがとうございます。
これは正常なんでしょうか??
期待した処理は


文字>>>>a
result = a

文字>>>>b
result = b

文字>>>>c
result = c

文字>>>>d
result = d

文字>>>>^C


です。つまり、dを入力したときi=3となるようにしたいんです。
なんでcanf文を実行するとループが二回されるのが意味がわからないです

補足日時:2009/11/27 00:36
    • good
    • 0

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