gpt4 book ai didi

c - 我的 while 循环中的段错误

转载 作者:太空宇宙 更新时间:2023-11-03 23:20:46 24 4
gpt4 key购买 nike

我正在尝试计算我从 argv 指定的文件中的行数和字符数。但是当我出于某种原因进入 while 循环时,我遇到了段错误。该程序在没有 while 循环的情况下运行良好,尽管它只经过一次。

#include <stdio.h>
#include <stdlib.h>

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

if(argc != 2) {
return 0;
}


FILE *fp;
char c;
int lines = 0;
int chs = 0;
fp = fopen(argv[1], "r");

//Segmentation Fault happens here on the while loop
while((c = fgetc(fp)) != EOF) {
if(c == '\n') {
lines += 1;
}
else {
chs += 1;
}

}

printf("Charaters: %d\n", chs);
printf("lines: %d\n", lines);


if(fp){
fclose(fp);
}
return 0;
}

最佳答案

  • 您的代码需要更严格地遵循 Idiomatic C。
  • 您应该立即验证 fopen,而不是在您已经尝试使用 fp 之后。
  • fgetc 返回 int,而不是 char。这是因为它需要返回有关流状态的边信道信息(即 EOF),此信息不能用 char 表示,但您可以安全地转换如果值不是 EOF,则将 int 值转换为 char
  • \r\n 代表换行符(不仅仅是单独的 \n),您可能需要考虑如何处理不同的字符类。
  • 您的程序不处理非平凡的编码(即它只能正确处理您系统的 native 编码中的文件,大概是 ASCII)。您应该使用 Unicode 库从文件中正确读取单个字符:例如,您的程序会将 UTF-8 中的代理项对视为两个字符而不是 1 个字符,并且会错误地计算 UTF-16 文件。

更好:

FILE* fp = fopen( argv[1], "r" );
if( !fp ) {
printf( "Could not open file \"%s\" for reading.\r\n", argv[1] );
return 1;
}

int lines = 0;
int chars = 0;

int nc;
while( ( nc = fgetc( fp ) ) != EOF ) {

char c = (char)nc;

if ( c == '\n' ) lines++;
else if( c != '\r' ) chars++;
}

printf( "Characters: %d\r\nLines: %d\r\n", chars, lines );

fclose( fp );

return 0;

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

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