2

上記のプログラムでは、malloc を使用して char へのポインターの配列を作成し、qsort を使用してそれらの「文字列」をソートしようとしています。間違った結果が得られます。さらに重要なことは、プログラムを実行するたびに異なる結果が得られることです。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLINE 1000 
#define MAXCHARS 1000 
int ballin_compare(const void *, const void *); 

int main(int argc, char *argv[]){
    char *linebuffer, **pointbuffer; 
    FILE *fp;
        int i = 0;  

        if(argc < 2 || (fp = fopen(argv[1], "r")) == NULL)
            return 1; 

    linebuffer = (char *)malloc(MAXCHARS); 
    pointbuffer = (char **)malloc(sizeof(char *) * MAXLINE); 

    while(i < MAXLINE && fgets(linebuffer, MAXCHARS, fp) != NULL){
        pointbuffer[i] = (char *)malloc(strlen(linebuffer)); 
        strcpy(pointbuffer[i++], linebuffer); 
    }

    free(linebuffer); 
    qsort(pointbuffer, i, sizeof(char *), ballin_compare); 

    fclose(fp); 
    if((fp = fopen(argv[1], "w")) == NULL)
        return 1; 

    int x; 
    for(x = 0; x < i; x++)
        fputs(pointbuffer[x], fp);

    fclose(fp); 
    printf("%s sorted successfully", argv[1]);
        return 0;   
}



int ballin_compare(const void *c, const void *d){
    char *a = (char *)c; 
    char *b = (char *)d; 

    int i = 0;
    while(a[i] && b[i] && a[i] == b[i])
        i++; 

    if(a[i] < b[i])
       return -1; 
    if(a[i] > b[i])
       return 1; 

    return 0; 
}

私の推測では、strcmp に相当するものを台無しにしてしまったのです。私の比較がうまくいかなかったアイデアはありますか?

4

2 に答える 2

5

問題は、配列の要素へのポインターqsortを渡すことです。配列要素は typeであるため、比較関数は入力を受け取ります。現在書かれているように、アドレスを文字列であるかのように比較しているため、当然意味のない結果になります。char *char **

あなたは書くべきです

const char *a = *(const char **)c;
const char *b = *(const char **)d;

ballin_compare

于 2013-08-10T01:28:18.650 に答える
4
char *a = (char *)c;

二重に間違っています。

まず、C ではキャストは必要ありません。不要な場合は、キャストを避ける必要があります。

次に、コンパレータ関数に実際の文字列が渡されていません。それらへのポインターがあります(考えてみてください: 比較対象のオブジェクトは任意の型とサイズになる可能性があるため、qsort などの一般的な並べ替え関数を実装するときに、任意の型のオブジェクトをコンパレーター関数に渡すことは不可能です)。だからあなたが本当に欲しいのは

const char *a = *(const char **)c; 

の使用にも注意してconstください - それがあるのは偶然ではありません。さらに、単に使用する

return strcmp(a, b);

車輪を再発明する必要はありません (そして、再発明する必要はありません)。

また、面白いマニュアルを読んでください- これはすべて明確に書かれています。

于 2013-08-10T01:29:29.177 に答える