• 締切済み

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で記録され、想定したように動きません。 これの解決方法を教えていただきたいです。回答よろしくお願いします。

みんなの回答

回答No.5

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]){ に修正すると、解決するはずです。

Harusann0408
質問者

補足

迅速な回答に感謝致します。 恐縮なのですがPCが壊れてしまい、アドバイスを実行することが出来ません。復旧次第、ご連絡させて頂きます。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.4

>「すべて」見せていただけますか? わかっているとは思いますが、念のため。 PCから必ず「コピペ」してくださいね。 1文字たりとも手打ちはダメです。

Harusann0408
質問者

補足

迅速な回答と親切な対応を頂けて、ありがとうございます。 恐縮なのですがPCが壊れてしまい、アドバイスを実行することが出来ません。復旧次第、他の回答者様のアドバイスを実行後、それでも動かないようであれば、またご連絡させて頂きます。よろしくお願いします。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.3

そのプログラムに関する手持ちのコードを 「すべて」見せていただけますか? PCのスクリーンショットとかだと全部じゃないと思うので。

回答No.2

Order[][]は二次元配列ですよね。 InputI関数から参照しているのはOrder[]であり次元が違います。 というかそもそも char Order[DATA][40]={"名前(ローマ字)","電話番号","メールアドレス","郵便番号","都道府県","住所","一言(100字以内)"}; が、意味不明です。[40]ってなんでしょう? 中身は一次元配列にしか見えないのですが・・ それ以外の「DATA」「a」「s」も変数定義部分が記載されていません。 おまけですが、引数と仮引数を同じ名前にするのは止めましょう。 混乱の元です。

  • wormhole
  • ベストアンサー率28% (1622/5658)
回答No.1

for文がどうのではなく配列の使い方を間違えているかと。

関連するQ&A

  • C言語での構造体

    C言語の構造体で配列を扱うとき、 struct ○○{  char ○○[○] とすれば出来ますが、同じようにして構造体で二次元配列を扱うことは出来ますか? 一度組んでみたのですが、 #include<stdio.h> struct aaa{ int no; char name[128]; char y_name[128]; char n_name[128]; char s_name[128][128]; }; int main(void){ int i; struct aaa iryo[99]; printf("入力前\n"); /* 構造体配列に scanf()でデータを入力 */ for(i = 0; i < 3; i++) { // printf("input...\n"); scanf("%d", &iryo[i].no); scanf("%s", iryo[i].name); scanf("%s", iryo[i].y_name); scanf("%s", iryo[i].n_name); scanf("%s", iryo[i].s_name); } printf("入力後\n"); printf("出力前\n"); /* 入力データの確認 */ for(i = 0; i < 3; i++) { printf("番号:%02d 内容:%s Y分岐:%s N分岐:%s 他分岐:%s\n", iryo[i].no, iryo[i].name, iryo[i].y_name, iryo[i].n_name, iryo[i].s_name); } printf("出力後\n"); printf("%d",sizeof(struct aaa)); return 0; } としたら、エラーは出ませんが、実行すると何も表示されませんでした。

  • C言語について プログラムが動きません

    ゲームのプログラムを作りたいものです。 今、試作の途中の段階で以下のようなプログラムを作ってみたのですが、 コアダンプが表示されてうまく起動しません。 どの点を変更すればいいのか、教えてください。 使っている言語はC言語です。 よろしくお願いいたします。 #include <stdio.h> #include <string.h> struct monster{ int type; /* タイプ */ char trick[25]; /* 技 */ char trick2[25]; /* 技2 */ int tricktype; /* 技1のタイプ */ int tricktype2; /* 技2のタイプ */ int trickeffect; /* 技1の威力 */ int trickeffect2; /* 技2の威力 */ char name[10]; /* 名前 */ int attack; /* 攻撃力 */ int diffence; /* 防御力 */ int speed; /* 素早さ */ /* 1,fire 2,water 3,nature 4,thunder 5,wind */ }; char names[5][10] = {"v", "w", "x", "y", "z"}; main(){ int s = 0; int a[3]; int i; int m; struct monster monster[5] = { { 1, "a", "b", 1, 2, 120, 80, "v", 60, 60, 60}, { 2, "a", "b", 2, 3, 120, 80, "w", 60, 60, 60}, { 3, "a", "b", 3, 4, 120, 80, "x", 60, 60, 60}, { 4, "a", "b", 4, 5, 120, 80, "y", 60, 60, 60}, { 5, "a", "b", 5, 1, 120, 80, "z", 60, 60, 60}, }; printf("好きなモンスターを3つ選んでください\n\n"); while (s < 1){ for (i = 0; i++; i<3){ printf("%d体目を選んでください。\n\n", i+1); for(m = 0; m++; m < 4) printf("%d, %s\n", m+1, monster[m].name); printf("5, %s\n\n", monster[4].name); scanf("%d", a[i]); printf("%d体目 : %s\n\n", i+1, monster[a[i]-1].name); } printf("これでよろしいですか?\n"); for(i = 0; i++; i<2) printf("%d体目 : %s ", i+1, monster[a[i]-1].name); printf("3体目 : %s\n\n", monster[a[2]-1].name); printf("1、はい 2、いいえ\n"); scanf("%d", &i); if(i=1) return s = 1; else return s = 0; } }

  • for文

    以下のプログラムのforの条件文がなぜこれで動くのかよくわからないので 教えていただけないでしょうか? #include<stdio.h> int main(void) { int i; char str[] = "ABC"; char *ptr = "123"; for(i=0;str[i];i++) putchar(str[i]); putchar('\n'); for(i=0;ptr[i];i++) putchar(ptr[i]); putchar('\n'); printf("str = \"%s\"\n",str); printf("ptr = \"%s\"\n",ptr); return(0); }

  • C言語

    はじめまして。 C言語を学習しております。 参考書の練習問題19(下記)で以下の部分がどうしても理解できません。 1、【(People*)mallock】の部分で、mallockの前のPeopleを()でくくる意味とPeopleの後に*を付ける意 味がわかりません。 2、InputPeople関数とShowPeople関数の最後の部分(●の印をしている部分)になぜretutn 0がいらないのでしょうか(原文にはretutn 0の記述がありません)。 3、【while (1)】の部分で、while文の使い方は、「while(条件式){ 繰り返す文;}」のはずですが、なぜ条件式の部分が1なのでしょうか(a > bなどの形ではないのでしょうか)。 4、【while (1)】の部分で、InputPeople関数の引数としてdata[count]がありますが、何を意味しているのかがわかりません。People型の変数dataとint型の変数countを組み合わせてどういう意味合いになるのでしょうか。dataとcountはどういう関係でしょうか。 5、【while (1)】の部分で、count++する意味がわかりません。 6、【while (1)】文内の下記の記述が何を意味しているのかがわかりません。       if (count >= datasize) {       datasize += 10;       data = (People*)realloc(data,sizeof(People) * datasize);      } ここでつまづいて先に進めず困っております。 どうか教えていただきたく、お願い致します。 ●練習問題19 練習問題16(一番下に参考として解答を載せています)の、 「3人分の、名前、年齢、性別、を入力して表示するプログラムを作りなさい。 ただし、データは構造体で記憶することとし、 また、データの入力と表示はそれぞれ専用の関数を作って行うこととする。」 という問題を元に、何人分でも入力できるように改造しなさい。 なお、年齢に-1が入力されれば入力終了とする。 ※配列番号がint型なのでint型の最大値まで扱えれば良い。 ●練習問題19の解答 #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct { char name[256]; int age; int sex; } People; void InputPeople(People *data); void ShowPeople(People data); int main(void) { int i,count,datasize; People *data; datasize = 10; data = (People*)malloc(sizeof(People) * datasize); count = 0; while (1) { InputPeople(&data[count]); if (data[count].age == -1) break; count++; if (count >= datasize) { datasize += 10; data = (People*)realloc(data,sizeof(People) * datasize); } } for (i = 0;i < count;i++) { ShowPeople(data[i]); } free(data); return 0; } void InputPeople(People *data) { printf("名前:"); scanf("%s",data->name); printf("年齢:"); scanf("%d",&data->age); printf("性別(1-男性、2-女性):"); scanf("%d",&data->sex); printf("\n");     /*●retutn 0は不要?*/ } void ShowPeople(People data) { char sex[16]; printf("名前:%s\n",data.name); printf("年齢:%d\n",data.age); if (data.sex == 1) { strcpy(sex,"男性"); } else { strcpy(sex,"女性"); } printf("性別:%s\n",sex); printf("\n");     /*●retutn 0は不要?*/ } ●練習問題16の解答 #include <stdio.h> #include <string.h> typedef struct { char name[256]; int age; int sex; } People; void InputPeople(People *data); void ShowPeople(People data); int main(void) { People data[3]; int i; for (i = 0;i < 3;i++) { InputPeople(&data[i]); } for (i = 0;i < 3;i++) { ShowPeople(data[i]); } return 0; } void InputPeople(People *data) { printf("名前:"); scanf("%s",data->name); printf("年齢:"); scanf("%d",&data->age); printf("性別(1-男性、2-女性):"); scanf("%d",&data->sex); printf("\n"); } void ShowPeople(People data) { char sex[16]; printf("名前:%s\n",data.name); printf("年齢:%d\n",data.age); if (data.sex == 1) { strcpy(sex,"男性"); } else { strcpy(sex,"女性"); } printf("性別:%s\n",sex); printf("\n"); }

  • c言語のプログラミングについて聞きたいのですが

    自分は課題で「10人分の名前と点数を入力して降順に並び替える」というプログラムを作ろうとしているのですが、なかなかうまくいきません。一応↓の形までできたのですがなぜか数字が変になります。 どうしてか教えていただけないでしょうか。 #include<stdio.h> int main(void) {     int i,j;     int tensu[10][3];     char namae[10][6]; for(i=0;i<10;i++){ printf("名前の入力>>"); scanf("%s",&namae[i]); printf("点数の入力>>"); scanf("%d",tensu[i]); } printf("名前   点数\n"); for(j=0;j<10;j++) { printf("%s ",&namae[j]); printf("%10d\n",tensu[j]); } return 0; } それとポインタ?みたいなのもよく理解できず、点数で降順にしたあとに点数を使って名前を並び替えるのかなと思うのですがそれもよくわかりません。 どなたか教えてください

  • C++のfor文について

    C++では for ( int i = 0, j = 0; i < 10; i++ ) { } みたいな感じでforのなかで変数の宣言ができます。 ところで上の例ですとint型のiとjを2つ宣言していますが、 もしint型とchar型を宣言したい場合などは char j; for ( int i = 0; i < 10; i++ ) { } みたいにしないといけないのでしょうか? for ( int i = 0, char j; i < 10; i++ ) { } みたいにできると思ってやったらエラーになってしまうので・・。

  • C言語課題!C言語初心者です。お願いします。

    課題内容 要素数10の(0~9の順)配列Aの値を2倍して配列Bに格納して  その後配列Aの値を配列Bに、配列Bの逆順を配列Aに格納し  入れ替える前と入れ替えた後の配列A,Bの値を表示するプログラム 書いてみたプログラム #include <stdio.h> int main(void) { int i; int va[10] = {0,1,2,3,4,5,6,7,8,9}; /* 初期化 */ int vb[10]; puts("入れ替え前"); puts("-----------"); for(i=0 , i<10 , i++){ printf("va[%d] = %d\n" , i , va[i]); /* 入れ替え前の配列A */ } for(i=0 , i<10 , i++){ vb[10] = 2*va[10]; } for(i=0 , i<10 , i++){ printf("vb[%d] = %d\n" , i ,vb[i]); /* 入れ替え前の配列B */ } puts("入れ替え後"); puts("-----------"); for(i=0 , i<10 , i++){ vb[10] = va[10]; } for(i=0 , i<10 , i++){ printf("vb[%d] = %d\n" , i ,vb[i]); /* 入れ替え後の配列B */ } for(i = 0 , i < 5 , i++){ /* 配列Bの逆順を配列Aに格納 */ int temp = va[i]; va[i] = vb[4-i]; vb[4-i] = temp; } for(i=0 , i<10 , i++){ printf("va[%d] = %d\n" , i ,va[i]); /* 入れ替え後の配列A */ } return(0); } コンパイルできません。 教えてください。お願いします。

  • C言語の関数の定義について質問します

    struct monster{ int type; /* タイプ */ char trick[25]; /* 技 */ char trick2[25]; /* 技2 */ int tricktype; /* 技1のタイプ */ int tricktype2; /* 技2のタイプ */ int trickeffect; /* 技1の威力 */ int trickeffect2; /* 技2の威力 */ char name[10]; /* 名前 */ int power; /* 攻撃力 */ int diffence; /* 防御力 */ int speed; /* 素早さ */ int HP; /* 体力 */ /* 1,fire 2,water 3,nature 4,thunder 5,wind */ }; main(){ int a[2][3]; struct monster monster[5] = { { 1, "a", "b", 1, 2, 120, 80, "v", 60, 60, 60, 100}, { 2, "a", "b", 2, 3, 120, 80, "w", 60, 60, 60, 100}, { 3, "a", "b", 3, 4, 120, 80, "x", 60, 60, 60, 100}, { 4, "a", "b", 4, 5, 120, 80, "y", 60, 60, 60, 100}, { 5, "a", "b", 5, 1, 120, 80, "z", 60, 60, 60, 100}, }; struct monster monster2[5] = { { 1, "a", "b", 1, 2, 120, 80, "v", 60, 60, 60, 100}, { 2, "a", "b", 2, 3, 120, 80, "w", 60, 60, 60, 100}, { 3, "a", "b", 3, 4, 120, 80, "x", 60, 60, 60, 100}, { 4, "a", "b", 4, 5, 120, 80, "y", 60, 60, 60, 100}, { 5, "a", "b", 5, 1, 120, 80, "z", 60, 60, 60, 100}, }; inputmonster(a, monster); printf("これからバトルを開始します\n\n"); printf("player1は%sをくりだした。\n", monster[a[0][0]-1].name); printf("player2は%sをくりだした。\n", monster2[a[1][0]-1].name); battle(a); return 0; } void inputmonster(int x[][3], struct monster monster) { int i, s, t, m, n; for(t = 0; t < 2; t++){ s = 0; while (s < 1){ printf("player%dは好きなモンスターを3つ選んでください\n\n", t+1); for (i = 0; i<3; i++){ printf("%d体目を選んでください。\n\n", i+1); for(m = 0; m < 5; m++) printf("%d, %s\n", m+1, monster[m].name); scanf("%d", &x[t][i]); printf("%d体目 : %s\n\n", i+1, monster[x[t][i]-1].name); } printf("これでよろしいですか?\n"); for(i = 0; i<3; i++) printf("%d体目 : %s ", i+1, monster[x[t][i]-1].name); printf("1、はい 2、いいえ\n"); scanf("%d", &n); if(n == 1) s = 1; else s = 0; } } } 上記のようにプログラムをコンパイルしたところ、 monsterbattle.c: 関数 ‘inputmonster’ 内: monsterbattle.c:497:63: エラー: 添字が付けられた値が、配列、ポインタまたはベクト ルではありません for(m = 0; m < 5; m++) printf("%d, %s\n", m+1, monster[m].name); ^ monsterbattle.c:499:45: エラー: 添字が付けられた値が、配列、ポインタまたはベクト ルではありません printf("%d体目 : %s\n\n", i+1, monster[x[t][i]-1].name); ^ monsterbattle.c:503:68: エラー: 添字が付けられた値が、配列、ポインタまたはベクト ルではありません for(i = 0; i<3; i++) printf("%d体目 : %s ", i+1, monster[x[t][i]-1].na me); というような結果が返ってきました。 どうやら定義がうまくなっていないようなのですが、どこを改善すればうまく動くようになるのでしょうか? お手数ですが、よろしくお願いいたします。

  • c言語つくってみました

    #include<stdio.h> #define N 5 struct MEMBER{ int no; char name[8+1]; int run; int jump; int power; int sum; double avg; }; void Calc_Sum(struct MEMBER *data) { data->sum=data->run+data->jump+data->power; return(0); } void Calc_Avg(struct MEMBER *data) { data->avg=data->sum/3.0; return(0); } void Display_Data(struct MEMBER data) { printf("---判定---\n"); printf("背番号:%5d\n",data.no); printf("名前:%5s\n",data.name); printf("走力 :%5d 点数\n",data.run); printf("跳躍力:%5d 点数\n", data.jump); printf("筋力 :%5d 点数\n", data.power); printf("総計 :%5d 点数\n", data.sum); printf("平均 :%5.1f 点数\n", data.avg); return(0); } int main(void) { int i; struct MEMBER member[N] ={{51,"イチロー",95,95,80,0,0}, {55,"松井秀喜",70,80,90,0,0}, {18,"松坂大輔",75,75,80,0,0}, {18,"黒田博樹",80,85,85,0,0}, {19,"上原浩治",85,85,85,0,0}, }; struct MEMBER *p=member; /*総計の算出*/ for(i=0;i<N;i++) Calc_Sum(p+i); /*平均の算出*/ for(i=0;i<N;i++) Calc_Avg(p+i); /*結果の出力:*/ for(i=0;i<N;i++) Display_Data(member[i]); return(0); } 以上のようなのc言語をつくりました。 他に関数を2つ使用しなければならないのですが アドバイスよろしくお願い致します。

  • C言語 2次元配列で

    #include<stdio.h> int main() { char name[4][8]={"2013","mic","matsu","test"}; int i; for(i=0;i<4;i++) { printf("%s\n",name[i]); } return; } をいじって、配列の宣言をせずに、別の動作で同じ実行結果を得るためにはどうすればよいでしょうか? ただし、2次元配列を使用しないといけないのですが・・・。 すみませんが、できれば至急、ご指導、ソースコードの模範解答のほう、よろしくお願いします。