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 に答える
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 に答える