C 从文件中读取单词时出现分段错误
所以我从一个文件中读取,创建我自己的数组C 从文件中读取单词时出现分段错误,c,pointers,segmentation-fault,C,Pointers,Segmentation Fault,所以我从一个文件中读取,创建我自己的数组current\u word,创建一个指向该数组的指针,以便以后编辑它。我调用具有标点符号数组的words函数。虽然我从文件中提取的字符都不是这些标点符号,但我将它们添加到当前的单词数组中,该数组由我传入函数words的指针指向 我可能缺少一些关于指针的知识 这不断给我带来错误分段错误以及其他问题,这很可能是这个问题的重复: feof()在实际命中EOF之前不会返回非零。所以你调用words(): 每次调用fgetc()都返回EOF。而EOF是一个int
current\u word
,创建一个指向该数组的指针,以便以后编辑它。我调用具有标点符号数组的words函数。虽然我从文件中提取的字符都不是这些标点符号,但我将它们添加到当前的单词数组中,该数组由我传入函数words
的指针指向
我可能缺少一些关于指针的知识
这不断给我带来错误分段错误
以及其他问题,这很可能是这个问题的重复:
feof()
在实际命中EOF之前不会返回非零。所以你调用words()
:
每次调用fgetc()
都返回EOF
。而EOF
是一个int
值
但是你已经定义了charc代码>而不是正确的intc代码>尝试int c=fgetc(in)代码><代码>而(c!=EOF&&strchr(标点符号,c)==NULL){
。也,;:*!?'-\n\0\r“
-->,;:*!?'-\n\r”
仍然有相同的问题检查fopen
的返回值并显示file.txt
。显示file.txt
文件或至少它的前几行。你不需要将数组大小传递给words
,但你应该这样做,这样你就可以进行测试以确保你没有在数组边界之外写入。此外,你也不需要检查r*cw=current\u word;
要调用word
,只需使用current\u word
。
void words(FILE *in,char *current_word){
char punctuation[]= ". ,;:*!?'-\n\0\r";
char c = fgetc(in);
int i = 0;
while(strchr(punctuation,c) == NULL){
current_word[i] = c;
i++;
c = fgetc(in);
}
current_word[i] = '\0';
}
int main(){
FILE *in = fopen("file.txt","r");
while(!feof(in)){
char current_word[30];
char *cw = current_word;
words(in,cw);
printf("%s",current_word);
}
}
void words(FILE *in,char *current_word){
char punctuation[]= ". ,;:*!?'-\n\0\r";
char c = fgetc(in); /* feof() returns int, not char */
int i = 0;
/* following loop will never stop as EOF isn't in the string */
while(strchr(punctuation,c) == NULL){
current_word[i] = c;
i++;
c = fgetc(in);
}
current_word[i] = '\0';
}