gpt4 book ai didi

C fwrite 函数给出未知空间的数据

转载 作者:行者123 更新时间:2023-12-04 05:23:21 26 4
gpt4 key购买 nike

这个函数应该获取一个参数作为文件的指针并将所有文件放入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日

最佳答案

一个可能的原因是传递给 qsort() 的大小参数.来自 qsort() 的链接引用页面:

size - size of each element in the array in bytes



因此大小参数应该是 1 ,保证为 sizeof(char) ,而不是 sizeof(char*)这很可能是 48 .发布的代码错误地通知 qsort()那个 word指向一个数组 4 (或 8 )比实际数组大和 qsort() 倍将访问它不应该访问的内存。更改为:
qsort(word,strlen(word), 1, charCompare);

另一个可能的原因是由这一行引起的缓冲区溢出:
strncpy(&a.sorted[i],word,sizeof(word));
i while 的每次迭代都会增加循环但 sizeof(word)一直在写。 SIZE 的值和 BUFSIZ没有发布但即使它们相等 strncpy()将写超出 a.sorted 的范围在第一次迭代之后。

其他要点:
  • fgets() 不能保证读取换行符,因此请检查 strchr() 的返回值在取消引用它之前。
  • tolower() 返回小写字符,它不会改变它的参数。
  • 为什么读入临时缓冲区( word )并复制?直接读入struct成员。
  • 关于C fwrite 函数给出未知空间的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13468972/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com