C中的字数统计程序计数不正确

时间:2016-03-21 12:15:50

标签: c shell word-count

就像标题所说我在C中编写一个字数克隆程序,但在其中一个案例中没有正确计算。 我有.txt文件,该程序工作正常,但如果我使用以下命令

linux>./wordcountclone < file.txt

它只占一半的话。 我做错了吗? 如果我使用例如

linux>./wordcountclone file.txt

linux>./wordcountclone -l -d file.txt

工作正常。 这里是使用

的函数
void fileO(FILE * name, int car, int word, int lin, int dig){
    int c , nl, np, nc, nd, state;
    state = OUT;
    nl = nc = nd = 0;
    np = -1;
    c = fgetc(name);
    while (c != EOF){
        c = fgetc(name);
        nc++;
    if(nc > INT_MAX)
        return;
    if (c == '\n')
        nl++;
    if (c > 47 && c < 58)
        nd++;
    if (c == ' ' || c == '\n' || c == '\t')
        state = OUT;
    if (state == OUT) {
        state = IN;
        np++;
    }
}


    if(lin !=0)
        printf("lines %d ", nl);    
    if(word != 0)
        printf("words %d ", np);
    if(dig !=0)
        printf("digits %d ", nd);
    if(car != 0)
        printf("chars %d ", nc);
    printf("\n");

}

我正在使用的.txt文件包含以下文本

the cat sat on the mat
the dog jumped over the moon

1 个答案:

答案 0 :(得分:2)

这里至少有两个问题:

  • 您总是跳过连续两次执行c = fgetc(name);的第一个字符 - 一个在while之前,然后在循环内。

  • state逻辑不正确 - 如果您在仅包含空格的文件上运行此逻辑,它仍会计算单词。

另外,有几点建议:

  • 而不是if (c > 47 && c < 58)您可以if ('0' <= c && c <= '9')或使用isdigit()

  • 使用isspace()检查空白