質問: ### 前提・実現したいこと お世話になります。またしても初歩的な内容で申し訳ないのですが、現在勉強のため、入力を平面として捉え、「0」「1」に変換して位置関係を保持したまま出力する、というプログラムを作っています。 例えば、 入力が下記のような場合(先頭でマス目の数を、縦 横 の順に入力しています)、 ``` 10 12 **.......**. .***.....*** ....**...**. .........**. .........*.. ..*......*.. .*.*.....**. *.*.*.....*. .*.*......*. ..*.......*. ``` 出力結果が以下の様になります。(見づらくてすみません。。) ``` 110000000110 011100000111 000011000110 000000000110 000000000100 001000000100 010100000110 101010000010 010100000010 001000000010 ``` 2次元配列(インデックスが座標)に一文字ずつ格納して、後で順番に出力する、という方式で記述したのですが、うまくいきません...。 色々試したところ、最終的に望んだ結果が得られるプログラムを記述することはできました。 しかし、いまだになぜ、最初の記述の仕方で実現できなかったのか、がわかりません。 ご教授よろしくお願いします。 ### 発生している問題 以下が問題のソースコードになります。 縦×横の回数ループを繰り返し、指定子「%c」によって一文字ずつ読み込み変数inputへ格納後、内容を評価し、01変換を行っています。 しかし、結果がなぜが一行ごとに右へずれていってしまいます。 途中にprintfを挟み確認をしてみたのですが、各行最初の一文字が読み込まれていない?ようで、しかし、ループのカウンターにもミスはないように思え、さらに終端文字も特にこの場合関係なさそうで、原因がわかりません。 よろしくお願いします。 ### 当初のソースコード [正常に動作せず] ``` #include #define MAX 100 int p[MAX][MAX]; /*2次元配列,最初のインデックスが行,二つ目のインデックスがその行の何番目か*/ int N; /*全体の高さ*/ int M; /*全体横幅*/ char input; /*入力文字,一文字のつもり*/ int main(void){ int i,j; scanf("%d %d",&N,&M); /*全体の縦横の長さを取得*/ /*縦N行分繰り返し*/ for(i=0;i #define MAX 100 int p[MAX][MAX]; /*2次元配列,最初のインデックスが行,二つ目のインデックスがその行の何番目か*/ int N; /*全体の高さ*/ int M; /*全体横幅*/ char input[MAX]; /*入力1行分*/ int main(void){ int i,j; scanf("%d %d",&N,&M); /*全体の縦横の長さを取得*/ /*縦のN行分繰り返し*/ for(i=0;i
回答: こんにちは。 1行の終わりには改行文字`'\n'`が入ってます。 最初の`scanf("%d %d",&N,&M)`が終わった時、入力ポインタは`10 12`行の終わりにある`'\n'`の位置を指してます。 なので、次の`scanf("%c",&input);`で改行文字が読み出され、`'*'`でないので`p[i][j]`に`0`が入ります。 他の行の終わりでも同じことが起きています。