2

该函数应该获取一个参数作为文件的指针,并将所有文件放入struct anagram,然后将其写入另一个文件。现在每个数据之间都有很大的空间。charCompare 工作正常,因为我制作了一个测试文件来测试它。

#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <errno.h>
#include <ctype.h>
#include "anagrams.h"
#define SIZE 80

//struct
struct anagram {
char word[SIZE];
char sorted[SIZE];
};

void buildDB ( const char *const dbFilename ){

    FILE *dict, *anagramsFile;
    struct anagram a;

    //check if dict and anagram.data are open
    errno=0;
    dict= fopen(dbFilename, "r");

    if(errno!=0) {
        perror(dbFilename);
        exit(1);
    }

    errno=0;

    anagramsFile = fopen(anagramDB,"wb");

    char word[SIZE];
    char *pos;
    int i=0;

    while(fgets(word, SIZE, dict) !=NULL){

        //get ripe of the '\n'
        pos=strchr(word, '\n');
        *pos = '\0';

        //lowercase word
        int j=0;
        while (word[j]){
            tolower(word[j]);
            j++;
        }

        /* sort array using qsort functions */ 
        qsort(word,strlen(word), sizeof(char), charCompare);

        strncpy(a.sorted,word,sizeof(word));

        fwrite(&a,1,sizeof(struct word),anagramsFile);

        i++;
    }
    fclose(dict);
    fclose(anagramsFile);

}

数据:10日1日2日

4

1 回答 1

3

一个可能的原因是传递给qsort(). 从链接的参考页面qsort()

size - 数组中每个元素的大小(以字节为单位)

因此 size 参数应该是1,保证是sizeof(char),而不是sizeof(char*)可能是4or 8。发布的代码错误地通知qsort()word指向一个比实际数组大4(或)倍的数组,并且将访问它不应该访问的内存。改成:8qsort()

qsort(word,strlen(word), 1, charCompare);

另一个可能的原因是此行导致的缓冲区溢出:

strncpy(&a.sorted[i],word,sizeof(word));

i在循环的每次迭代中都会递增,whilesizeof(word)总是被写入。SIZE和的值BUFSIZ不会发布,但即使它们相等,也会在第一次迭代后strncpy()写入超出范围。a.sorted

其他要点:

  • fgets()不能保证读取换行符,因此strchr()在取消引用之前检查返回值。
  • tolower()返回小写字符,它不会改变它的参数。
  • 为什么要读入临时缓冲区(word)并复制?直接读入struct会员即可。
于 2012-11-20T08:25:37.463 回答