構造体での質問!a.outで任意の人数の情報を格納して出力したい方法は?

このQ&Aのポイント
  • C言語で、構造体を使ってa.outの後にID、ログイン名、ファミリーネーム、ファーストネームを格納して出力するコードを書いた場合、a.out 5 のように書いて任意の人数の情報を格納して出力する方法はありますか?
  • 質問者は、C言語で構造体を使用してa.outにID、ログイン名、ファミリーネーム、ファーストネームを格納して出力するコードを書きました。しかし、任意の人数の情報を格納して出力する方法がわかりません。どうすれば実現できるでしょうか?
  • C言語のプログラムで、構造体を利用してa.outにID、ログイン名、ファミリーネーム、ファーストネームを格納し、任意の人数の情報を出力する方法を教えてください。
回答を見る
  • ベストアンサー

構造体での質問!

a.outの後にid ログイン名 ファミリーネーム ファーストネームを格納して出力するコードを 書いたのですが、これを a.out 5 のように書いて任意の人数の情報を格納して出力するものに したいのですが、↓をどうすればよいのでしょうか?お願いします!! #include <stdio.h> #include <string.h> structstudent { intid; char login[16]; char first[16]; char family[16]; }; intmain(intargc, char *argv[]) { structstudent st, *sp; if (argc!= 5) { printf("usage: %s[id] [login] [Family name] [First name]¥n", argv[0]); exit(‐1); } st.id= atoi(argv[1]); strcpy(st.login, argv[2]); strcat(st.first, argv[3]); strcpy(st.family, argv[4]); sp=&st; printf("id=%d¥n", sp‐>id); printf("loginname=%s¥n", sp‐>login); printf("Name=%s%s¥n", sp‐>first, sp‐>family); }

質問者が選んだベストアンサー

  • ベストアンサー
noname#208507
noname#208507
回答No.3

構造体を配列にするのでなく、引数で各データを受け取って出力すればよいのなら下のように直せば可能です。 if (argc < 6) { /* 略 */ } int i, n = atoi(argv[1]) * 4; n = ((argc-2) / 4 < n) ? (argc-2) / 4 : n; for (i = 1; i < (n * 4) + 1; i+=4) { /* 略(各文の argv[1] を argv[i+1] のように直す) */ } ところで、ctype.h と stdlib.h をインクルードし忘れていますね。ANo.2さんもおっしゃっていますが、質問前にきちんと動作などを確認されましたか?

その他の回答 (2)

  • unacyo
  • ベストアンサー率51% (35/68)
回答No.2

残念ですが、説明が足りないように感じます。 任意のデータを格納してますよね?プログラム起動時の引数で、ですが。 格納データの渡し方を変えたいと言うことですか? ファイルから?キーボードから直接入力? あと、何でfamilyを格納するのに、strcatなのでしょう? 初期化してないから、ゴミデータの後に入力データが格納されて、バッファオーバーフローする可能性が有りますよ?

chianti1986
質問者

補足

説明不足でした、すみません。 データの渡し方を変えたいと言う意味でした。

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

任意の整数値を格納して出力するのなら書けますか?

関連するQ&A

  • 構造体(超初心者です)

    学校の課題で4つの情報を引数とし、a.out 人数の数(a.out 5)の後に手入力でその5人の 情報を入力するコードを書けと言うものが出たのですが、色んな人の教えでここまで書いたのですが まだ良く分かりません、ifの中身とfor文の中身を教えてください。 後間違っている部分を直して頂けると嬉しいです!!! #include <stdio.h> #include <string.h> #include<ctype.h> #include<stdlib.h> struct student { intid; char login[16]; char first[16]; char family[16]; }; intmain(intargc, char *argv[]) { structstudent st, *sp; if (argc < 6) { / ??? / } int i, n = atoi(argv[1]) * 4; n = ((argc-2) / 4 < n) ? (argc-2) / 4 : n; for (i = 1; i < (n * 4) + 1; i+=4) { /*(各文の argv[1] を argv[i+1] のように直す) */ } sp=&st; printf("id=%d¥n", sp‐>id); printf("loginname=%s¥n", sp‐>login); printf("Name=%s%s¥n", sp‐>first, sp‐>family); }

  • 構造体宣言したポインタ変数に値を代入するには?

    strcpy(p -> key ,name);と打ってp -> key に入力した名前を格納したいのですがうまくいきません。 ほかにもp -> key = nameなども試してみましたがコンパイルエラーが出現してダメでした。 うまく格納できるやり方があれば教えてください。よろしくお願いします。 #include<stdio.h> #include<string.h> #define WORD_LENGTH 50 /* 文字列の最大長 */ typedef struct cell{ char key[WORD_LENGTH]; struct cell *next; /* 次のセルへのポインタ */ } CELL; void main(void) { char name[WORD_LENGTH]; CELL *p; printf("名前入力\n"); scanf("%s\n", name); strcpy(p -> key ,name); printf("%s\n", p -> key); }

  • 構造体の配列について(2)

    前回「構造体の配列について」という質問タイトルで、質問させていただいたのですが、理解が完全ではないため同じようなプログラム内容ではありますが、疑問を書かせていただきます。よろしくお願いします。 ----------------------------------------------------------------------- #include<stdio.h> #include<string.h> struct person{ char name[1];    //// (1) //// int height; int weight; }; int main() { struct person dt[10]; strcpy(dt[0].name,"日本一郎"); strcpy(dt[2].name,"関東次郎"); strcpy(dt[9].name,"関西三郎"); dt[1].weight=99; dt[1].height=168; printf("%s %s %s %d %d \n",dt[0].name,dt[2].name,dt[9].name,dt[1].weight,dt[1].height); return 0; } ----------------------------------------------------------------------- 以上のプログラムの(1)の部分で、文字を1文字しか格納出来ないのに、 strcpy(dt[0].name,"日本一郎"); strcpy(dt[2].name,"関東次郎"); strcpy(dt[9].name,"関西三郎"); としても何故正しく実行できるのかわかりません。 前回いろいろとご回答いただいたのに、しっかりと理解できない者ですが、教えていただければ嬉しいです。

  • 構造体のサンプルのソースなんですけど・・

    自分が勉強するのに使ってる参考書にのってるサンプルのソースを自分なりにいじってみたら、コンパイルはできるのに実行すると、「不正な処理を行ったので強制終了します」とメッセージがでて実行できません。 ソースは↓ #include<stdio.h> #include<string.h> struct kakakutyp{ int teika; int waribiki; int yuutai; }; struct syohintyp{ char name[30]; struct kakakutyp kakaku; int zaiko; }; main() { struct syohintyp *sp; strcpy(sp->name,"システム手帳B-386"); sp->kakaku.teika=8500; sp->kakaku.waribiki=7900; sp->kakaku.yuutai=7600; sp->zaiko=32; printf("品名:%s\n",sp->name); printf("定価価格:%d\n",sp->kakaku.teika); printf("割引価格:%d\n",sp->kakaku.waribiki); printf("優待価格:%d\n",sp->kakaku.yuutai); printf("在庫個数:%d\n",sp->zaiko); } になってます。なんでじっこうできないんでしょうか?参考書では、ドット演算子を使ってたんですが、それをアロー演算子に直したつもりです。 よろしくお願いします。

  • 構造体の型について

    ある構造体をxxxと名づける以下のプログラムを作成しました。 ーーーーーーーーーーー #include <stdio.h> #include <string.h> main() { typedef struct { char variable[64]; char type[64]; char value[512]; } xxx; xxx aaa; strcpy(aaa.variable,"bbb"); printf("%s\n",aaa.variable); } ーーーーーーーーーーー これは動き、bbbと表示されます。 しかしながら、構造体のポインタを使用した 以下のプログラムではコンパイルはとおりますが実行時にコアダンプして落ち ます。 ーーーーーーーーーーーーーーーーーーーー #include <stdio.h> #include <string.h> main() { typedef struct { char variable[64]; char type[64]; char value[512]; } xxx; xxx* aaa; strcpy(aaa->variable,"bbb"); printf("%s\n",aaa->variable); } ーーーーーーーーーーーーーーーーーーーーーーー 両プログラムの意図はまったく同じなのに何故いけないのでしょうか。

  • 構造体メンバ及び、strncpy()について

    /* 構造体のメンバを char name[30]; にした時は実行できますが、char *name; としたときはプログラムを実行できません。 コンパイルエラーはともに出ないのですが、strncpy();の使い方が間違っているのか、先に構造体側でメモリサイズを確保しないと、使えないのか? メンバをポインタで持たせた構造体を初期化する関数の作り方を教えてください。 よろしくお願いします。 */ #include <stdio.h> #include <string.h> typedef struct{ char *name; int no; }ST; void set_name(ST *st, char *name, int no); int main(void) { ST st; set_name(&st, "テスト", 1); printf("%s No%d\n", st.name, st.no); return 0; } void set_name(ST *st, char *name, int no) { strncpy(st->name, name, 30); st->no=no; }

  • ファイル操作やポインタ、構造体について(C言語)

    C言語の課題で詰まってしまいました。宜しければ助言を宜しくお願いします。 コマンド選択で,0) 終了,1) 追加,2) 検索(id),3)変更 が行える学生成績管理プログラムを作成する。 データは,学生の番号 名前 GP 総単位数 形で学生のデータを持っているファイルである。 #include<stdio.h> #include<stdlib.h> #include<string.h> struct student{ int id; char name[25]; int gp; int credit; }; void add(char *, struct student);//追加 int search(char *, struct student *);//検索 void change(char *, struct student);//指定したidの学生の情報を変更 main(int argc,char *argv[]) { FILE *fp; int i = 0; int num; struct student students; if(argc == 1){ printf("set filename\n"); return 1; } while(1) { printf("1)add 2)search 0)quit "); scanf("%d",&num); if(num == 0) break; /* 追加 */ if(num == 1) { printf("id name gp credit ? "); scanf("%d %s %d %d", &students.id, students.name, &students.gp, &students.credit); add(argv[1], students); } /* 検索 */ if(num == 2) { printf("id ? "); scanf("%d", &students.id); if(search(argv[1],&students)){ printf("%d %s %d %d\n", students.id, students.name, students.gp, students.credit); } else{ printf("ID %d Not Found.\n",students.id); } } if(num == 3){ //変更 } } } /* 追加ルーチン */ void add(char *filename, struct student students) { FILE *fp; if((fp = fopen(filename, "a")) == NULL){ printf("can't open %s\n", filename); exit(1); } fprintf(fp,"%d %s %d %d\n", students.id, students.name, students.gp, students.credit); fclose(fp); } /* 検索ルーチン */ int search(char *filename, struct student *students) { FILE *fp; int id; char name[25]; int gp; int credit; if((fp = fopen(filename, "r")) == NULL){ printf("can't open %s\n", filename); exit(1); } while(fscanf(fp,"%d %s %d %d", &id, name, &gp, &credit) != EOF) { if(id == students->id){ students->id = id; strcpy(students->name ,name); students->gp = gp; students->credit = credit; return 1; } } return 0; fclose(fp); } /* 変更ルーチン */ void add(char *filename, struct student students){ } ------------ここまで------------ ファイルの操作での入出力は"a"や"r"、また"w"を利用するのかとも思いましたが、 指定したIDの内容を書き換えるにはポインタを2つ使う方法しか思いつかないのですが、与えられた問題で、変更のプロトタイプは void change(char *, struct student); となっていて、どうやるのかまったく見当もつきません。 稚拙な文で伝わりにくいかもしれませんが、 変更のやり方についてご教授願います。 見難くて申し訳ありません。 どうか宜しくお願いします。

  • 構造体についてです。

    身体測定表を作っていて最初に作ったデータを変更して表示したいのですがNo1の168cm→162cm No2の74kg→74.5kg  No3の20歳→19歳 No4の田中三郎→小林三郎 (No3と4は構造体ポインタを使ってデータを変更) 全データを表示させてその後No1と3の名前~体重を丸ごと入れ替えて全データを表示させたいのですがエラーがでてしまいます。 分かる人がいましたらどこを直したらいいか教えて下さい。 #include <stdio.h> #include <string.h> struct data{ int no; char name[21]; int age; int height; float weight; }; struct data *sp; void main(){ int i; struct data a[4]={ {1,"鈴木太郎",23,168,60}, {2,"山本次郎",17,180,74}, {3,"山田花子",20,156,53}, {4,"田中三郎",35,172,68}, }; struct data b; for(i=0;i<4;i++){ printf("番号 :%d\n",a[i].no); printf("名前 :%s\n",a[i].name); printf("年齢 :%d歳\n",a[i].age); printf("身長 :%dcm\n",a[i].height); printf("体重 :%4.1fkg\n\n",a[i]. weight); } a[0].height=162; a[1].weight=74.5; *sp[2].age=19; strcpy(*sp[3].name,"小林三郎"); for(i=0;i<=4;i++){ b=a[0]; a[0]=a[2]; a[2]=b; a[0].no=1; a[2].no=3; } for(i=0;i<=4;i++){ printf("番号 :%d\n",a[i].no); printf("名前 :%s\n",a[i].name); printf("年齢 :%d歳\n",a[i].age); printf("身長 :%dcm\n",a[i].height); printf("体重 :%4.1fkg\n\n",a[i].weight); } }

  • 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; } としたら、エラーは出ませんが、実行すると何も表示されませんでした。

  • 構造体の配列について

    --------------------------------------------------- #include<stdio.h> #include<string.h> struct person{ char name[80]; int height; int weight; }; int main() { struct person dt[10]; strcpy(dt[1].name,"日本太郎");    //// (1) //// dt[1].weight=70; dt[1].height=180; dt[5]=dt[1];    //// (2) //// printf("%s %d %d \n",dt[1].name,dt[1].weight,dt[1].height); return 0; } ----------------------------------------------------- 以上のプログラムは参考書に記述されていたものですが、(1)の部分で、配列名dtに「"日本太郎"」を設定するならわかるのですが、配列の1つの要素「dt[1]」に「"日本太郎"」を設定しているというように見え、これはエラーが出ると感じたのですが出ません。 char dt[10]; strcpy(dt[1],"日本太郎"); 以上のようにしてしまっているというイメージがあります。 後、(2)の部分もよくイメージがわきません。 以上、どのような仕組みになっているのか教えていただければ嬉しいです。

専門家に質問してみよう