【发布时间】:2021-04-19 00:01:48
【问题描述】:
我有一个程序读取文本文件的行并将它们存储在linesArr 中,我还定义了一个函数compFunc,它将两个字符串作为输入,复制它们并将副本转换为小写在返回 strcmp(copy1, copy2) 的值之前。我正在尝试使用此功能将linesArr 与qsort(linesArr, size, 255, compFunc 按字母顺序排序。但数组中的值从{"Bob", "James", "Alice"} 变为{(null), (null), (null)}。
这就是linesArr 的初始化方式。
char **linesArr = (char**)malloc(size*sizeof(char));
for (int i = 0; i < size; i++) {
linesArr[i] = (char*)malloc(255*sizeof(char));
}
它使用文件指针fp从文本中填充值
for (int i = 0; i < size; i++) {
fgets(line, 255, fp);
strcpy(linesArr[i], line);
}
为什么 qsort 会删除数组中的值?
【问题讨论】:
-
你不应该使用 malloc 的 return。
-
由于您没有在第一个 malloc 中分配正确的大小,因此您在其余代码中会出现未定义的行为。
-
malloc(size * sizeof(char))应该是malloc(size * sizeof(char*))。所以linesArr是它应该大小的 1/4 或 1/8。 -
如果你想比较字符串而不考虑大小写,那么考虑检查你的实现是否提供
stcasecmp()。使用它会比为每次比较制作修改后的字符串副本更有效。或者考虑自己编写——这不会那么难。
标签: c sorting dynamic-memory-allocation c-strings qsort