gpt4 book ai didi

c - 使用 stdlib 的 qsort() 对字符串数组进行排序

转载 作者:太空狗 更新时间:2023-10-29 17:01:02 28 4
gpt4 key购买 nike

一些前言:我是一名计算机工程专业的学生,​​在学习了 3 个学期的 Java(直到数据结构)之后,我正在学习 C 语言的第一个类。这个问题与家庭作业有关,但为我解决了几个步骤。

我有一个读入内存的输入文件,它存储在 char[9][500] 中。我读入了最多 500 个最大长度为 8 的字符串。我试图使用 stdlib 的内置 qsort() 函数对该数组进行排序,但出现了一些内存错误。

重要代码片段:

char data[4][500][60];
char debug[500][9];
size_t count = 0;

/* initialize file, open for reading */
FILE* pUserlog;
pUserlog = fopen("userlog","r");

while(!feof(pUserlog))
{
fscanf(pUserlog, "%9s %8s %16s",debug[count], data[1][count], data[2][count]);
fgets(data[3][count], 60, pUserlog);
count++;
}

这部分将数据读入数组。这部分感兴趣的数组是“调试”。这是上面指定的数组。这是我的 qsort 比较函数:

int compare(const void* a, const void* b)
{
const char **ia = (const char **)a;
const char **ib = (const char **)b;
puts("I'm in compare!");
return strncmp(*ia, *ib,8);
}

这是我调用 qsort 的尝试:

size_t debug_len = sizeof(debug)/sizeof(char*);
printf("debug len: %d, count: %d, sizeof(char*): %d\n",debug_len,count,sizeof(char*));
qsort(debug,count, sizeof(char *), compare);

我尝试在我的调用中替换 debug_len ,但我仍然出现段错误。这是输出:

$ ./testdebug len: 1125, count: 453, sizeof(char*): 4I'm in compare!Segmentation fault (core dumped)

谢谢!

最佳答案

比较函数将接收指向被比较元素的指针。您实际上是在尝试使用 strncmp() 比较字符。由于您有指向每个字符串的指针,因此将其转换为 char * 并进行比较。

int compare(const void* a, const void* b)
{
const char *ia = (const char *)a;
const char *ib = (const char *)b;
puts("I'm in compare!");
return strncmp(ia, ib, 9);
}

还要记住,它是一个数组数组,而不是一个指针数组。所以元素的大小应该是数组的大小,9,而不是指针的大小,4。此时,使用 sizeof debug[0] 会更容易,因为它是一个二维数组。如果您没有使用正确的大小执行此操作,qsort() 只会破坏您的数组。

size_t elemsize = sizeof debug[0];      /*   9 - size of each element */
size_t count = sizeof(debug)/elemsize; /* 500 - number of elements in array */
qsort(debug, count, elemsize, compare);

关于c - 使用 stdlib 的 qsort() 对字符串数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5370753/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com