ページ 11

二次元配列

Posted: 2014年9月30日(火) 01:33
by ジェリナゲ
文字一文字と数字をscanfで3回読み取るプログラムをつっくたのですが、2回しか読み取ることができません
なぜか二回目にiが0から2に飛んでしまいます
なにがいけないのでしょうか

コード:

#include <stdio.h>

int main(void){

  int m,i;
  char va;

  for(i=0;i<3;i++){
    scanf("%c %d",&va,&m);
  }

  return 0;
}


Re: 二次元配列

Posted: 2014年9月30日(火) 02:14
by かずま
ジェリナゲ さんが書きました:なにがいけないのでしょうか
"a123b456c789\n" を入力してみてください。
うまくいくでしょう。

あなたは、"a 123\nb 456\nc 789\n" と入力したのではありませんか?

scanf("%c %d",&va,&m); のあとに、
printf("i=%d, va=%02x, m=%d, i=%d\n", i, va, m);
を書いてみたら何が悪いかわかるはずです。

scanf の "%c %d" を " %c%d" にすると、解決するでしょう。
なぜだかは、scanf のマニュアルをよ~く読んでみましょう。

Re: 二次元配列

Posted: 2014年9月30日(火) 08:14
by みけCAT
ジェリナゲ さんが書きました:なぜか二回目にiが0から2に飛んでしまいます
本当にそんな怪奇現象が発生しているのですか?
printfデバッグやデバッガで確認してみてください。
ジェリナゲ さんが書きました:なにがいけないのでしょうか
この怪奇現象が本当に発生しているのであれば、コンパイラかコンピュータがおかしいです。
本当に発生しているわけではないのであれば、仮説を立てるだけ立てて検証しないジェリナゲさんの姿勢がいけないかもしれません。

Re: 二次元配列

Posted: 2014年9月30日(火) 08:19
by みけCAT
かずま さんが書きました:scanf の "%c %d" を " %c%d" にすると、解決するでしょう。
なぜだかは、scanf のマニュアルをよ~く読んでみましょう。
本当ですか?
ここでいう「解決」とは、どういう状態でしょうか?
https://ideone.com/gN0LWM


ごめんなさい。読み間違えました。
https://ideone.com/bLDJZa

Re: 二次元配列

Posted: 2014年9月30日(火) 10:33
by かずま
かずま さんが書きました: printf("i=%d, va=%02x, m=%d, i=%d\n", i, va, m);
を書いてみたら何が悪いかわかるはずです。
訂正します。
printf("i=%d, va=%02x, m=%d\n", i, va, m);
かずま さんが書きました: scanf の "%c %d" を " %c%d" にすると、解決するでしょう。
%c の直前のスペースが重要です。
%d の直前のスペースはあってもなくても問題ありません。

疑問が解決したら、この掲示板を読んでいる人のために
解説をお願いします。
まだ疑問があるのなら、何がわからないのかを質問してください。

ところで、タイトルが「二次元配列」になっているのは、なぜですか?

Re: 二次元配列

Posted: 2014年10月01日(水) 00:36
by ジェリナゲ
すみません、もともと二次元配列の問題で分からないところがあったのですが、それの原因がここの部分だったので質問するときにタイトルを書き換え忘れました。
遅くなってすみません。
キーボードから入力される文字はバッファと呼ばれるところに一時的に保存されて、エンターを押すと出力され、バッファの中は空になります
scanf()では最後の改行文字がバッファに残るため、次の出力時にその改行文字が出力されてしまうため今回のようなことになりました。
%cの直前にスペースを入れると改行文字を読み飛ばして出力するのでうまく動作するようになります

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