• ベストアンサー

レコード型データのソートについて

(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 当方プログラミング初心者です おねがいします><

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

  • ベストアンサー
回答No.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)
回答No.2

strcmp(a[i].name, a[j].name)とかになるはずですが。 > strcmpはint型かなと思い intではありません。「かなと思い」ではなく、調べてください。 > strcmpの使い方が悪いのでしょうか? はい。その通りです。strcmpってのは、stringのcompare、 文字列の比較をするものですので。 > 配列では使えないとかそういうことでしょうか・・・ そんなことはないです。配列の中であろうが、 正しく文字列を渡すかぎり、使用可能です。

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.1

> : undefined reference to `strcomp' strcmp では。(comp⇒cmp)

hisetu_001
質問者

お礼

早速の回答ありがとうございます<_ _> 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の使い方が悪いのでしょうか? サイトで使い方等見ましたが悪いところは見当たらないように 思えました。 配列では使えないとかそういうことでしょうか・・・

関連するQ&A