我正在尝试计算从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;
}
答案 0 :(得分:2)
fopen
,而不是在您尝试使用fp
之后。fgetc
返回int
,而不是char
。这是因为它需要返回有关流状态的旁道信息(即EOF
),此信息不能由char
表示,但您可以安全地转换int
值如果值不是char
,则EOF
。\r
代表换行符(而不仅仅是单独的\r\n
)时,您的代码会将\n
视为常规字符,您可能需要考虑如何处理不同的角色类。更好:
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;