c - 如何对字符串数组使用 qsort?

标签 c string qsort

#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 不正确,将它用于数组到 char 指针的正确方法是什么?

最佳答案

您的比较器每对按地址发送。 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);

应该这样做。

关于c - 如何对字符串数组使用 qsort?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23189630/

相关文章:

c - 预处理器宏 GCC : pasting x and x does not give a valid preprocessing token

c - 如何使用 while 循环对指针指向的所有项目求和

java - Java中字符串相等性比较失败

比较器未在 qsort 中调用 [错误 : expected expression before comparator]

c - 使用 qsort 同时对两个数组进行排序?

c - 在 BST 中找到添加到 k 的节点对

c++ - 如何获取 C++ 字符串流的结尾?

java - 从 String 转换为 BigDecimal 以对货币进行数学计算

c - qsort 不会对动态分配的结构数组进行排序

c++ - const char* 是指向单个字符还是字符串?