- 締切済み
c言語 for文の挙動について
c言語はまだ習い始めで、拙い質問ですが回答していただければ幸いです。 for(i=0;i<DATA;i++){ InputI(i,a,s); } void InputI(int i,int a,char s[ID][DATA+1]){ printf("%sを入力してください:",Order[i]); scanf("%s",s[a-1][i]); printf("%sを%sとして登録しました\n",Order[i],s[a-1][i]); } char Order[DATA][40]={"名前(ローマ字)","電話番号","メールアドレス","郵便番号","都道府県","住所","一言(100字以内)"}; 下のInputI関数を使い、for文でさらにその下のOrder配列の内容を配列に記録したいのですが、名前を入力した瞬間に名前からひと言までがすべてNULLで記録され、想定したように動きません。 これの解決方法を教えていただきたいです。回答よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- superside0
- ベストアンサー率64% (461/711)
ID個 x DATA+1個 の文字列(最長99文字) を扱いたいので char s[ID][DATA+1][size]という 3次元の配列を用意されたということですね。 これを、InputI関数に渡しているのに、渡されたInputI() 側では void InputI(int i,int a,char s[ID][DATA+1]){ と二次元の配列で受け取ってしまっています。 ここで、メモリー上の配置が狂ってきますね。 多分、コンパイルするときもワーニングが出ていると思いますが… void InputI(int i,int a,char s[ID][DATA+1]){ を void InputI(int i,int a,char s[ID][DATA+1][size]){ に修正すると、解決するはずです。
- asuncion
- ベストアンサー率33% (2127/6289)
>「すべて」見せていただけますか? わかっているとは思いますが、念のため。 PCから必ず「コピペ」してくださいね。 1文字たりとも手打ちはダメです。
補足
迅速な回答と親切な対応を頂けて、ありがとうございます。 恐縮なのですがPCが壊れてしまい、アドバイスを実行することが出来ません。復旧次第、他の回答者様のアドバイスを実行後、それでも動かないようであれば、またご連絡させて頂きます。よろしくお願いします。
- asuncion
- ベストアンサー率33% (2127/6289)
そのプログラムに関する手持ちのコードを 「すべて」見せていただけますか? PCのスクリーンショットとかだと全部じゃないと思うので。
- Ultra-Hetare
- ベストアンサー率38% (204/526)
Order[][]は二次元配列ですよね。 InputI関数から参照しているのはOrder[]であり次元が違います。 というかそもそも char Order[DATA][40]={"名前(ローマ字)","電話番号","メールアドレス","郵便番号","都道府県","住所","一言(100字以内)"}; が、意味不明です。[40]ってなんでしょう? 中身は一次元配列にしか見えないのですが・・ それ以外の「DATA」「a」「s」も変数定義部分が記載されていません。 おまけですが、引数と仮引数を同じ名前にするのは止めましょう。 混乱の元です。
- wormhole
- ベストアンサー率28% (1626/5665)
for文がどうのではなく配列の使い方を間違えているかと。
補足
迅速な回答に感謝致します。 恐縮なのですがPCが壊れてしまい、アドバイスを実行することが出来ません。復旧次第、ご連絡させて頂きます。