###前提・実現したいこと
お世話になります。またしても初歩的な内容で申し訳ないのですが、現在勉強のため、入力を平面として捉え、「0」「1」に変換して位置関係を保持したまま出力する、というプログラムを作っています。
例えば、
入力が下記のような場合(先頭でマス目の数を、縦 横 の順に入力しています)、
10 12 **.......**. .***.....*** ....**...**. .........**. .........*.. ..*......*.. .*.*.....**. *.*.*.....*. .*.*......*. ..*.......*.
出力結果が以下の様になります。(見づらくてすみません。。)
110000000110 011100000111 000011000110 000000000110 000000000100 001000000100 010100000110 101010000010 010100000010 001000000010
2次元配列(インデックスが座標)に一文字ずつ格納して、後で順番に出力する、という方式で記述したのですが、うまくいきません…。
色々試したところ、最終的に望んだ結果が得られるプログラムを記述することはできました。
しかし、いまだになぜ、最初の記述の仕方で実現できなかったのか、がわかりません。
ご教授よろしくお願いします。
###発生している問題
以下が問題のソースコードになります。
縦×横の回数ループを繰り返し、指定子「%c」によって一文字ずつ読み込み変数inputへ格納後、内容を評価し、01変換を行っています。
しかし、結果がなぜが一行ごとに右へずれていってしまいます。
途中にprintfを挟み確認をしてみたのですが、各行最初の一文字が読み込まれていない?ようで、しかし、ループのカウンターにもミスはないように思え、さらに終端文字も特にこの場合関係なさそうで、原因がわかりません。
よろしくお願いします。
###当初のソースコード [正常に動作せず]
C
1#include<stdio.h> 2#define MAX 100 3 4int p[MAX][MAX]; /*2次元配列,最初のインデックスが行,二つ目のインデックスがその行の何番目か*/ 5int N; /*全体の高さ*/ 6int M; /*全体横幅*/ 7char input; /*入力文字,一文字のつもり*/ 8 9int main(void){ 10 int i,j; 11 scanf("%d %d",&N,&M); /*全体の縦横の長さを取得*/ 12 13 /*縦N行分繰り返し*/ 14 for(i=0;i<N;i++){ 15 /*M文字分読み取り繰り返し*/ 16 for(j=0;j<M;j++){ 17 scanf("%c",&input); /*指定子を「%c」にして一文字ずつ読み取る*/ 18 if(input=='*'){ /*塗りつぶし'*'だったら数値 1 を格納*/ 19 p[i][j]=1; 20 } 21 } 22 } 23 24 /*2次元配列を視覚的にプロット*/ 25 for(i=0;i<N;i++){ 26 for(j=0;j<M;j++){ 27 printf("%d",p[i][j]); 28 fflush(0); 29 } 30 puts(""); 31 } 32 33 return 0; 34}
↓入力↓
10 12 **.......**. .***.....*** ....**...**. .........**. .........*.. ..*......*.. .*.*.....**. *.*.*.....*. .*.*......*. ..*.......*.
↓実行結果↓
011000000011 000111000001 110000011000 110000000000 011000000000 001000001000 000100001010 000011001010 100000100010 100000010000
###正常に動作するソースコード
読み込みを一行ごとにして、配列に格納後、インデックスをずらすことによって一文字ずつ評価したところ、望んだ結果が得られました。
c
1#include<stdio.h> 2#define MAX 100 3 4int p[MAX][MAX]; /*2次元配列,最初のインデックスが行,二つ目のインデックスがその行の何番目か*/ 5int N; /*全体の高さ*/ 6int M; /*全体横幅*/ 7char input[MAX]; /*入力1行分*/ 8 9int main(void){ 10 int i,j; 11 12 scanf("%d %d",&N,&M); /*全体の縦横の長さを取得*/ 13 14 /*縦のN行分繰り返し*/ 15 for(i=0;i<N;i++){ 16 scanf("%s",&input); /*一行分をまるまる取得して配列inputへ*/ 17 18 /*得られた文字列を格納した配列を先頭から順番に一文ずつ内容を評価*/ 19 for(j=0;j<M;j++){ 20 if(input[j]=='*')p[i][j]=1; /*塗りつぶし'*'だったら数値 1 を格納*/ 21 } 22 } 23 24 /*2次元配列を視覚的にプロット*/ 25 for(i=0;i<N;i++){ 26 for(j=0;j<M;j++){ 27 printf("%d",p[i][j]); 28 } 29 puts(""); 30 } 31 32 return 0; 33}
↓出力結果(入力は同じ)↓
110000000110 011100000111 000011000110 000000000110 000000000100 001000000100 010100000110 101010000010 010100000010 001000000010
###補足情報
MinGW
Eclipse Cpp Mars
Windows 10
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/30 16:03