无法在C中按字母顺序对字符串列表进行排序

时间:2013-08-05 07:31:16

标签: c string algorithm sorting

我编写了一个程序来接受来自用户的5个字符串,然后使用冒泡排序算法按字母顺序显示它们。但是,字符串的显示顺序与输入的顺序相同。请告诉我这里我做错了什么。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void sSwap(char *s1, char *s2);

int main(){
    char *sList[5],input[100],*p;
    int i,j;

    puts("Enter 5 strings");
    for(i=0;i<5;i++){
        gets(input);
        sList[i] = (char *)malloc(strlen(input)+1);
        strcpy(sList[i],input);
    }

    puts("");

    for(i=3;i>=0;i--){
        for(j=0;j<=i;j++){
            if(strcmp(sList[j],sList[j+1])>0)
                sSwap(sList[j],sList[j+1]);
        }
    }

    for(i=0;i<5;i++)
        puts(sList[i]);
    return 0;
}

void sSwap(char *s1, char *s2){
    char *temp;
    temp = s1;
    s1 = s2;
    s2 = temp;
}

3 个答案:

答案 0 :(得分:4)

正如您所知,您的交换函数获取值并按值交换它们,这意味着当您离开函数时,将不会保存更改并返回旧值。试试这个

void sSwap(char **s1, char **s2);

int main(){
    char *sList[5],input[100],*p;
    int i,j;

    puts("Enter 5 strings");
    for(i=0;i<5;i++){
        gets(input);
        sList[i] = (char *)malloc(strlen(input)+1);
        strcpy(sList[i],input);
    }

    puts("");

    for(i=3;i>=0;i--){
        for(j=0;j<=i;j++){
            if(strcmp(sList[j],sList[j+1])>0)
                sSwap(&sList[j],&sList[j+1]);
        }
    }

    for(i=0;i<5;i++)
        puts(sList[i]);
    return 0;
}

void sSwap(char **s1, char **s2){
    char *temp;
    temp = *s1;
    *s1 = *s2;
    *s2 = temp;
}

答案 1 :(得分:2)

你的一个问题是当你交换两个字符串时,你不会检查你是否必须将它与这个字符串的新邻居交换。

所以我会做一个递归函数来解决这个问题。就像你交换一样,你调用函数(比方说void sort(char **list, int index)):

sort(sList, 0) //to start from beginning and check the new order

如果字符串等于或者顺序正确,例如:

    sort(sList, currentListIndex);

所以你会:

void sort(char **sList, int index) {
     if (sList[index+1]) {
         if (strcmp(sList[index],sList[index+1]) > 0){
             sSwap(sList, index); // you can swap direclty on the tab
             return sort(sList, 0);
         }
         return sort(sList, index+1);
     }
     return void;
}

sort(sList, 0);

我已经有一段时间不做C所以也许指针错了,但这就是想法

答案 2 :(得分:1)

qsort函数在stdlib.h中

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

定义数组中元素的数量

#define n_array sizeof(array)/sizeof(const char *)

和比较函数

static int compare (const void * a, const void * b)
{
    return strcmp (*(const char **) a, *(const char **) b);
}

然后在main中你应该使用,替换sSwap

qsort (array, n_array, sizeof (const char *), compare);