- ベストアンサー
レコード型データのソートについて
(C言語) レコード型のソート(ポインタのソート)をしたいのですが コンパイルしようとするとstrcompでエラーが出てしまいます。 どこが違うのでしょうか教えてください<__> (ソートは名前だけです。 Ann 18 Candy 16 ・ ・ ・ 見たいな感じです) #include<stdio.h> #include<string.h> #define N 10 int main(void) { static struct girl{ char *name; int age; }*t,*p[N],a[]={"Ann",18,"Rolla",19,"Nancy",16,"Eruza",17,"Juliet",18, "Machilda",20,"Emy",15,"Candy",16,"Ema",17,"Mari",18}; int i,j,n=10; for(i=0;i<10;i++){ p[i]=&a[i]; } for(i=0;i<n-1;i++){ for (j=i+1;j<n;j++){ if(-1==strcomp(a[j],a[i])){ t=p[j]; p[j]=p[i]; p[i]=t; } } } } Error : undefined reference to `strcomp' collect2: ld returned 1 exit status 当方プログラミング初心者です おねがいします><
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
やや問題があるようです。 ポインターのみを並べ替えるなら、 f(-1==strcomp(a[j],a[i])) は、aを参照するのは変です。 aは元データでこの部分は変わらないはずです。 比較の意味がない。 また、strcmp は文字列を比較するもので、 文字列メンバーをきちんと明示しなきゃいけません *p[N]ではなく、ここは、**p と宣言すべきです。 カギ括弧つきの宣言なら、p[N][0]とすべきですが、 こう宣言するとアドレスの代入ができない 練習するときはこまめにデータを表示しながらやると良いです ちなみに、下記に付加した2種類のデータ表示関数を見れば a と p の配列の違いがわかるでしょう。 /// 例 #include<stdio.h> #include<string.h> #define N 10 static struct girl { char *name; int age; } **p, // *p[N]ではなく、このように宣言 a[] = {"Ann",18,"Rolla",19,"Nancy",16,"Eruza",17,"Juliet",18, "Machilda",20,"Emy",15,"Candy",16,"Ema",17,"Mari",18}; // データ表示用の関数その1 void disp1(struct girl *data) { int i; printf("//\n"); for (i = 0; i < N; i++) { printf("name=%s \t age=%d \n", data[i].name, data[i].age); } } // データ表示用の関数その2 void disp2(struct girl **data) { int i; printf("//\n"); for (i = 0; i < N; i++) { printf("name=%s \t age=%d \n", data[i]->name, data[i]->age); } } int main(void) { int i,j ; disp1(a); p = (void *)malloc(sizeof(struct girl *) * N); // N個ぶんのポインターが入る場所をここで確保 for (i = 0; i < N; i++) { p[i] = &a[i]; } disp2(p); for (i=0;i<N-1;i++) { for (j=i+1;j<N;j++) { if (-1 == strcmp(p[j]->name,p[i]->name)) // 文字列をきちんと比較する { (int)p[i] = (int)p[i] ^ (int)p[j]; (int)p[j] = (int)p[i] ^ (int)p[j]; (int)p[i] = (int)p[i] ^ (int)p[j]; // 排他的論理和を使うと、データ入れ替えができる、(トリビアな知識です) } } } disp2(p); }
その他の回答 (2)
- MrBan
- ベストアンサー率53% (331/615)
strcmp(a[i].name, a[j].name)とかになるはずですが。 > strcmpはint型かなと思い intではありません。「かなと思い」ではなく、調べてください。 > strcmpの使い方が悪いのでしょうか? はい。その通りです。strcmpってのは、stringのcompare、 文字列の比較をするものですので。 > 配列では使えないとかそういうことでしょうか・・・ そんなことはないです。配列の中であろうが、 正しく文字列を渡すかぎり、使用可能です。
- MrBan
- ベストアンサー率53% (331/615)
> : undefined reference to `strcomp' strcmp では。(comp⇒cmp)
お礼
早速の回答ありがとうございます<_ _> strcmpでコンパイルしましたが error: incompatible type for argument 1 of `strcmp' error: incompatible type for argument 2 of `strcmp' と出ました。 strcmpはint型かなと思いint配列へa[j]=、a[i]を代入して コンパイルしましたが通りませんでした><、 strcmpの使い方が悪いのでしょうか? サイトで使い方等見ましたが悪いところは見当たらないように 思えました。 配列では使えないとかそういうことでしょうか・・・