gpt4 book ai didi

c - getc 中的段错误

转载 作者:行者123 更新时间:2023-11-30 15:30:14 25 4
gpt4 key购买 nike

它只是一个程序,我试图读取文件中作为参数传递的单词的出现次数,该文件也作为下一个参数传递。

代码如下所示:

#include <stdio.h>

extern void exit(int);

void main(int argc, char *argv[]) {

char C, buf[10];
int count = 0, i = 0;
FILE *fp;

if ( argc != 3 ) {
printf("Please provide proper args\n");
exit(0);
}
fp = fopen(argv[2], "r");
if( fp == NULL ) {
printf("File couldn't be opened\n");
exit(1);
}
else {
do {
while ( (C = fgetc(fp)) && ( C != ' ') ) {
//if ( C == EOF ) break;
buf[i] = C;
i++;
}
buf[i] = '\0';
i = 0;

if (strcmp(argv[1], buf) == 0) count++;
} while (C != EOF );
}
close(fp);
printf("Total \"%s\" occurances is %d\n", argv[1], count);

}

GDB:

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7a925fd in getc () from /lib64/libc.so.6
Missing separate debuginfos, use: debuginfo-install glibc-2.18-12.fc20.x86_64

现在,如果我删除第一个 while 之后的 "if" 语句之前的注释,就不会出现段错误。该程序中唯一的一行被注释了。

但如果是这样的话,那么我们肯定已经越过了 getc 部分并进入了 while 部分。我认为问题可能出在执行 strcmp 时。但为什么我在 gdb 的 getc 中看到错误。

最佳答案

通过检查文件末尾的注释,您实际上有一个无限循环,其中 fgetc继续返回EOF,但你从不检查它。这导致 undefined behavior因为这样您的写入将远远超出 buf 数组的范围。可能会发生的情况是,您随后覆盖 FILE 指针 fp,从而对下一次调用 fgetc 进行操作,以对无效的 FILE 指针。

正如另一条评论中所述,fgets返回一个int。您需要知道(char) EOF != (int) EOF

关于c - getc 中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25699543/

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