#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
函数时,它会返回null。我确定我使用的是qsort incorrectly
,使用它来将数组用于char指针的正确方法是什么?
答案 0 :(得分:3)
您的比较器每对按地址发送。即它们是指向char的指针。
将比较器更改为:
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);
应该这样做。
答案 1 :(得分:2)
compar
函数获取的是指向数组中元素的指针,在本例中是指向char
的指针。因此参数str1
和str2
实际上是指向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);
答案 2 :(得分:1)
此行不正确。
qsort(lines, 200, sizeof(char), sortstring);
将其更改为
qsort(lines, 200, sizeof(char*), sortstring);