1

我编写了一个程序来接受来自用户的 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;
}
4

3 回答 3

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;
}
于 2013-08-05T07:36:42.210 回答
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 语言了,所以也许指针是错误的,但这是我的想法

于 2013-08-05T07:50:32.427 回答
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);
}

然后主要你应该使用,替换 sSwap

qsort (array, n_array, sizeof (const char *), compare);
于 2013-08-05T07:41:16.630 回答