2

したがって、構造体の配列を受け取ると思われるこの並べ替え関数があり、それらを名前で整理する必要があります。両方に姓と名があり、姓が同じ場合は、名に移動する必要がありますも比較。そこで、姓と名を 1 つに結合した 2 つの文字列を作成し、リストを反復処理してどちらが小さいかを確認し、上に移動します。しかし、問題は...それは何もしません...まったく、そして私はその理由がわかりません!?

void sortStruct(struct student *list, int studentCount){

int j, k;

struct student temp;

char buffer[35];
char buffer2[35];

for (j = 0 ; j <= studentCount-2 ; j++){

    sprintf(buffer, "%s, %s", list[j].lastname, list[j].firstname);

    for(k = 1 ; k <= studentCount-1 ; k++){

        sprintf(buffer2, "%s, %s", list[k].lastname, list[k].firstname);

        if(buffer < buffer2){

            temp = list[j];
            list[j] = list[k];
            list[j] = temp;

        }
    }
}
}

誰が何が悪いのか知っていますか?

4

2 に答える 2

4

buffer < buffer2あなたが望むものではありません。これは、2 つのメモリ アドレスを比較しているだけです。関数を使用する必要がありますstrcmp()。例えば、

if (strcmp(buffer, buffer2) < 0)

于 2013-03-03T04:59:09.747 に答える
2

関数は次のようになります。

名前比較用

void sortStruct(struct student *list, int studentCount)
{

   int j, k;
   struct student temp;
   char buffer[35];
   char buffer2[35];

   for (j = 0 ; j <= studentCount-2 ; j++)
   {
     sprintf(buffer, "%s, %s", list[j].lastname, list[j].firstname);
     for(k = 1 ; k <= studentCount-1 ; k++)
     {
       sprintf(buffer2, "%s, %s", list[k].lastname, list[k].firstname);
       if(strcmp(buffer, buffer2)<0)
       {
            temp = list[j];
            list[j] = list[k];
            list[j] = temp;
       }
     }
   }
}

名前の長さの比較用

void sortStruct(struct student *list, int studentCount)
{

  int j, k;
  struct student temp;
  char buffer[35];
  char buffer2[35];

  for (j = 0 ; j <= studentCount-2 ; j++)
  {
    sprintf(buffer, "%s, %s", list[j].lastname, list[j].firstname);

    for(k = 1 ; k <= studentCount-1 ; k++)
    {

     sprintf(buffer2, "%s, %s", list[k].lastname, list[k].firstname);

      if(strlen(buffer)< strlen(buffer2))
      {
         temp = list[j];
         list[j] = list[k];
         list[j] = temp;
      }
    }
 }
}
于 2013-03-03T05:00:28.263 に答える