【问题标题】:How to use qsort for an array of strings?如何将 qsort 用于字符串数组?
【发布时间】:2014-04-21 01:43:13
【问题描述】:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int sortstring(const void *str1, const void *str2) {
    const char *rec1 = str1;
    const char *rec2 = str2;
}

void sortutil(char* lines[]) {
    qsort(lines, 200, sizeof(char), sortstring);
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "sortutil.h"

int getarray(char *lines[]) {
    int i = 0;
    char *text = (char *)malloc(200);
    while (fgets(text, 200, stdin) != NULL) {
        lines[i] = text;
        i++;
        text = (char *)malloc(200);
    }
    return i;
}

void printarray(char *lines[], int max) {
    for (int i = 0; i < max; i++)
        printf("%s\n\n", lines[i]);
}

int main(int argc, char* argv[]) {
    char* arr[100];
    int numlines = getarray(arr);
    printf("There are %d lines\n", numlines);
    printarray(arr, numlines);

    for (int i = 1; i < argc;  i++) {
        if (strcmp(argv[i], "-s") == 0) {
            sortutil(arr);
            printarray(arr, numlines);
        }
    }
}

当我发送带有任意文本的文件时,它会读取文件并将其打印出来,但是当我调用 -s 并调用 qsort 函数时,它会返回空值。我确定我使用的是qsort incorrectly,将它用于指向字符指针的数组的正确方法是什么?

【问题讨论】:

    标签: c string qsort


    【解决方案1】:

    您的比较器将按地址发送到每一对。 IE。它们是指向字符的指针。

    将比较器更改为:

    int sortstring( const void *str1, const void *str2 )
    {
        char *const *pp1 = str1;
        char *const *pp2 = str2;
        return strcmp(*pp1, *pp2);
    }
    

    同样,您的sortutil 需要知道要排序的项目数,以及传递每个项目的正确大小。将其更改为:

    void sortutil(char* lines[], int count)
    {
        qsort(lines, count, sizeof(*lines), sortstring);
    }
    

    最后,来自main() 的调用应该是这样的:

    sortutil(arr, numlines);
    

    应该这样做。

    【讨论】:

    • 感谢您的工作,您唯一错过的就是使用 (const char**) 对 str1 和 str2 进行类型转换
    • @user3427042 实际上,我错过了发布代码中的正确类型(duh)。它应该是现在的样子。对于那个很抱歉。如果操作正确,则不需要演员表。谢谢你抓住那个。很高兴它有帮助。
    【解决方案2】:

    compar 函数得到的是指向数组中元素的指针,在这种情况下,是指向 char 的指针。所以参数str1str2实际上是指向char的指针。您必须像这样投射它们:

    int sortstring( const void *str1, const void *str2 )
    {
        const char *rec1 = *(char**)str1;
        const char *rec2 = *(char**)str2;
        int val = strcmp(rec1, rec2);
    
        return val;
    }
    

    那么你必须在qsort中使用合适的元素大小。

    qsort(lines, 200, sizeof(char*), sortstring);
    

    【讨论】:

    • 这可能是因为lines没有200个元素,也许你可以将numlines作为参数传递给sortutil并使用它而不是200。
    【解决方案3】:

    此行不正确。

        qsort(lines, 200, sizeof(char), sortstring);
    

    改成

        qsort(lines, 200, sizeof(char*), sortstring);
    

    【讨论】:

      猜你喜欢
      • 2013-04-19
      • 2015-03-23
      • 2014-06-11
      • 2013-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多