我创建了一个Node结构数组,我试图根据名为“word”的char *变量按字母顺序对节点进行排序。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "memwatch.h"
#include "concord.h"
#define BUFFSIZE 1000
int main(int argc, char** argv)
{
Node** list;
printf("%s%s\n","The file name is ", argv[1]);
readInputFile(argv[1], list);
return 0;
}
int compareWords(const void* nodeA, const void* nodeB)
{
Node* nodeAA = (Node *) nodeA;
Node* nodeBB = (Node *) nodeB;
puts("now here\n");
printf("%s\n", nodeAA->word);
printf("%s\n", nodeBB->word);
return strcmp(nodeAA->word, nodeBB->word);
}
void readInputFile(char* filename, Node** wordList)
{
FILE* file;
file = fopen(filename, "r");
wordList = calloc(BUFFSIZE, sizeof(Node*));
char* currentWord;
currentWord = (char*) malloc(sizeof(char) *BUFFSIZE);
int i;
i = 0;
while(fscanf(file, "%s", currentWord) == 1)
{
wordList[i] = (Node*) malloc(sizeof(Node));
wordList[i]->word = strdup(currentWord);
puts(wordList[i]->word);
}
fclose(file);
qsort(wordList, i, sizeof(Node), compareWords);
}
在我尝试在比较函数中打印出单词时打印垃圾之前,现在看起来该函数甚至没有被调用。
答案 0 :(得分:2)
现在看起来这个函数甚至没有被调用。
这是因为要排序0
元素列表,您永远不需要比较两个元素:
// ...
int i;
i = 0; // --- set to 0
while(fscanf(file, "%s", currentWord) == 1)
{
// i not changed ... causes other problems, too
// (contents omited)
}
fclose(file);
// i is still 0
qsort(wordList, i, sizeof(Node), compareWords);
// ...
除了您使用&#34; out参数&#34;如David C. Rankin的评论所指出的那样是错误的。在这种情况下,我还建议只使用返回值。
此外,我将该功能分成多个功能:
// Does the file opening and closing, calls readInput
Node * readInputFile(char const *);
// The actual reading
Node * readInput(FILE *)
// Probably do the sorting outside of these functions
答案 1 :(得分:0)
[首先你的问题是不完整的,因为它错过了向我们展示Node
的定义。]
然而,这里有三个问题:
我创建了一个Node结构数组
你没有。
下面
wordList = calloc(BUFFSIZE, sizeof(Node*));
为指针数组分配内存到Node
。
然后在这里
wordList[i] = (Node*) malloc(sizeof(Node));
您为先前创建的指针数组的每个元素分配了一个单独的内存块。
后者可能分散在整个过程的记忆中。正如qsort()
所期望的那样,它们不会位于连续的内存块中,这可能是以下原因:
我正在打印垃圾[之前]
从readInputFile()
返回后,wordList
的值将丢失。
读取循环不会递增索引计数器i
。
修复1.和2.创建一个数组并将其引用返回给readInputFile()
的调用者,如此
*wordList = calloc(BUFFSIZE, sizeof **wordList);
并按照以下方式致电qsort()
:
qsort(*wordList, i, sizeof(Node), compareWords);
要修复3.执行此操作:
size_t i = 0; /* No need for negative indexes here .*/
while((i < BUFFSIZE) /* Male sure not to overflow the array. */
&& (fscanf(file, "%s", currentWord) == 1))
{
(*wordList)[i].word = strdup(currentWord); /* This is POSIX not Standard C. */
puts((*wordList)[i].word);
++i;
}