使用C中的qsort按字母顺序对单词进行排序

时间:2014-01-18 14:48:24

标签: c sorting words qsort

我必须在我的IT课程上编写程序:

  1. 显示100个随机字符并使用qsort函数
  2. 对其进行排序
  3. 用户输入5个单词,使用qsort函数
  4. 按字母顺序对此单词进行排序

    现在我有类似的东西,但效果不好:/

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    #include <conio.h>
    
    int compare1(const void * a, const void * b) {
    return ( *(char*)a - *(char*)b );
    }
    
    int compare2(const void *a, const void *b) {
        return strncmp((const char *)a, (const char *)b, 20);
    }
    
    
    int main(){
    
     int i; 
     char words[5][20], c[27]="QWERTYUIOPASDFGHJKLZXCVBNM", t[101];
     srand(time(0));
     printf("QSORT PROGRAM\n\n");
     for (i=0;i<100;i++)
         t[i]=c[rand()%26];
     printf("Order before sorting:\n");
     for (i=0;i<100;i++)
         printf("%c", t[i]);
     qsort(t,100,sizeof(char),compare1);
     printf("\n\nOrder after sorting:\n");
     for (i=0;i<100;i++)
         printf("%c", t[i]);
     printf("\n\nEnter 5 words\n");
     for(i=0;i<5;i++)
         gets(words[i]);
     qsort(words,5,sizeof(char),compare2);
     printf("\nThe sorted order:\n");
     for(i=0;i<5;i++)
         puts(words[i]);
     printf("Press Any Key to Continue ");
     getch();
     return 0;
    }
    

1 个答案:

答案 0 :(得分:2)

来自qsort的联机帮助页:

   void qsort(void *base, size_t nmemb, size_t size,
              int(*compar)(const void *, const void *));
  

qsort()函数使用大小为nmemb的{​​{1}}元素对数组进行排序。   size参数指向数组的开头。

     

数组的内容按照升序排序   base指向的比较函数,用两个调用   指向被比较对象的参数。

     

比较函数必须返回小于,等于或的整数   如果第一个参数被认为是大于零   分别小于,等于或大于第二个。如果两个   成员比较相等,它们在排序数组中的顺序是   未定义。

那么,compar将要做的是调用你指定的比较函数,每次都指向两个'某事',即数组中保存的东西。然后它会根据需要交换“某些东西”。

有两种明显的方法可以使这项工作。

第一种也许是最明显的(但最不实用的)方式是你可以有一个二维chars数组,qsort可以交换一行chars与另一行(在这种情况下每个chars数组都会需要具有固定长度qsort(),包括终止零,并且所有字符串都需要精确地相互邻接,以便它可以在偏移{{1}处索引size字符串的开头}。

第二种更精细但更有用的方法是将数组作为指向要排序的字符串的指针列表。然后n只是交换指针。

你的主要问题是你两个都没做。在以下行中:

n * size

你说每个条目的大小是qsort,即一个字符长。所以qsort(t,100,sizeof(char),compare1); 会认为你正在排序一个只有100个字符的数组。那不行。

因为这是你的功课,我想我应该从这里离开你。