我的while循环中的分段错误

时间:2016-10-29 03:29:53

标签: c gcc segmentation-fault

我正在尝试计算从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;
}

1 个答案:

答案 0 :(得分:2)

  • 您的代码需要更密切地关注Idiomatic C.
  • 您应该立即验证fopen,而不是在您尝试使用fp之后。
  • fgetc返回int,而不是char。这是因为它需要返回有关流状态的旁道信息(即EOF),此信息不能由char表示,但您可以安全地转换int值如果值不是char,则EOF
  • \r代表换行符(而不仅仅是单独的\r\n)时,您的代码会将\n视为常规字符,您可能需要考虑如何处理不同的角色类。
  • 您的程序不处理非平凡的编码(即它只能正确处理系统本机编码中的文件,可能是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;