![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
下のソースを実行したらおかしなことになったんですがなんででしょうか??
#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
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') が入ります。
なるほどです!納得行きました。
scanfはエンターを二文字目として読んでただけなんですね。
あとfgetsを使ったらうまくいきました。
どうもありがとうございました。
No.5
- 回答日時:
No.4
- 回答日時:
入力ストリームに対して fflush しちゃダメ>#2.
scanf("%c%*[^\n]\n", &c[i]);
で動く, かも.
アドバイスありがとうございます!
試してみたけどうまくは動きませんでした。
最初はうまく行きそうな感じだったんですが。あと、
%*[^\n]←これは何をしてるんですか?
No.2
- 回答日時:
これはちょっと厄介な問題です。
C言語の仕様と現実のハード(キーボード)の間に矛盾があるのです。
scanfではabcdefを期待しているのですが
キーボードではa enter b enter ・・・という風に入力しないとCPUに送られません。
CPUは enter も1文字として受け取ってしまいますので上記のようになります。
邪道ですが「fflush(stdin)」で入力バッファークリアー(つまりenterの読み飛ばし)をはさめばうまく行くでしょう。
あくまでも正道ではありません。
この回答への補足
なるほどです!まさかenterまで読まれてたとは思ってなかったですね。。
fflushは知らなかったんで、覚えて使えるようにしときます^^
どうもありがとうございました!
No.1
- 回答日時:
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文を実行するとループが二回されるのが意味がわからないです
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# 【C言語】全角文字の配列を、全角のまま1文字ずつ出力する方法 4 2023/05/09 15:08
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgets関数を使用したときの文字...
-
fgetsで拾われる改行文字を削除...
-
CStringのFindで文字列検索を行...
-
fgetsでバッファ残留文字列を無...
-
単語数のカウントについて
-
反転した数値を表示させるやり方
-
sscanfとscanfの違いがよくわか...
-
全角文字のチェック
-
C言語で16進数文字列から16進数...
-
sscanfでフォーマットに合って...
-
ファイルを読み込みテキストフ...
-
c言語プログラミングHELP!
-
小文字のみを数える方法
-
itoaわかりません
-
c言語について array[i]-‘0’ こ...
-
C言語、単語ごとに改行したい
-
数字のINPUT
-
gets fgetsについて
-
”123456”といった整数を文字列...
-
Cで「大文字、小文字の判定」は...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
sscanfとscanfの違いがよくわか...
-
fgets関数を使用したときの文字...
-
反転した数値を表示させるやり方
-
Cで「大文字、小文字の判定」は...
-
charと%c , %s の関係について
-
C言語のステップ数をカウントす...
-
strstrを利用しない文字列検索...
-
C言語 空白の行(改行のみ)が...
-
fgetsで拾われる改行文字を削除...
-
文字列中に含まれる文字の個数...
-
C言語で16進数文字列から16進数...
-
itoaわかりません
-
文の意味
-
C言語 strlen 再入力を促す
-
fgetsでバッファ残留文字列を無...
-
全角文字のチェック
-
C++
-
ブランクのチェック
-
C言語、単語ごとに改行したい
おすすめ情報