在这个C程序中,我用键盘输入的单词读到了char指针。指针存储在指针数组中。然后我想通过函数比较用qsort对数组进行排序。我给它指针指向我的指针数组。 它根本不对数组进行排序。我不知道我是否来到这里是一个UB,或者我因错误的分配而错过了记忆。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
bool read_word(char ***a, int *length);
int comparison(const void *p, const void *q);
int main()
{
int *length = malloc(sizeof(int));
*length = 0;
char **array = malloc(sizeof(char *));
bool go = false;
while(go == false)
{
printf("Enter word: ");
go = read_word(&array,length);
}
qsort(array, *length - 1,sizeof(char *), comparison);
printf("\n");
for(int i = 0; i < *length; i++)
printf("%s\n", array[i]);
return 0;
}
bool read_word(char ***a, int *length)
{
char ch;
++*length;
char *word = malloc(20 * sizeof(char) + 1);
char *keep_word;
char **temp = realloc(*a,*length * sizeof(*a));
if(!temp)
exit(EXIT_FAILURE);
*a = temp;
keep_word = word;
while((ch = getchar()) != '\n')
*keep_word++ = ch;
*keep_word = '\0';
if(word == keep_word)
{
free(word);
--*length;
return true;
}
(*a)[*length - 1] = word;
printf("%s", (*a)[*length -1]);
printf("\nh\n");
return false;
}
int comparison(const void *p, const void *q)
{
const char *p1 = p;
const char *q1 = q;
return strcmp(p1,q1);
}
答案 0 :(得分:1)
更改为
int length = 0;//no need malloc
char **array = NULL;//first value is NULL
qsort(array, length, sizeof(char *), comparison);//not length-1
int ch;//type of return value of getchar is int
for(int i = 0; i < 20 && (ch = getchar()) != '\n'; ++i)//i : guard
const char *p1 = *(const char **)p;//qsort pass pointer to object to comparison function
const char *q1 = *(const char **)q;//if char *, char **
答案 1 :(得分:0)
你做
keep_word = word;
以后
if(word == keep_word)
括号中的条件始终为真。
另一方面,您的程序容易出错并且难以理解,因为您使用的指针太多了。在main()
中,length
应为int
,而不是int*
,数组应为char*
,而不是char**
。在read_word
中,a
应为char**
,而不是char***
。除非必要,否则不要使用指针!