计算线条,单词和字符

时间:2016-04-21 00:18:58

标签: c

我是编程新手。我正在尝试编写一个程序,从文本文件中读取行,单词和字符。这是下面的代码。

#include "stdio.h"
#include "stdlib.h"

#define IN 1
#define OUT 0

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

    int character, newword, newline, state;
    char c;
    state = OUT;
    character = newline = newword =0;
    input = fopen(argv[1], "r");

    if ( input == NULL){
        printf("Error! Can not read the input\n");
        exit(-1);
    }

    while ((c = fgetc(input)) != EOF){
        character++;
        if (c <'a' && c >'z'){;}
        if ( c <'A' && c >'Z'){;}

        if (c == '\n'){
            newline++;
        }
        if (c == ' ' || c == '\n' || c == '\t'){
            state = OUT;
        }

        else if (state == OUT){
            state = IN;
            newword++;
        }

    }

    printf("The number of lines: %d\n", newline);

    printf("The number of words: %d\n", newword);

    printf("The number of characters: %d\n", character);

    fclose(input);
}

我一直试图想出如何不读取!@#$%,{{1}等特殊字符}},^&*()_

我尝试使用if语句,因此它不会读取特殊字符,但它会读取它。我认为大写字母的if语句是错误的,因为它可能不会读小写字母。

在文件中包含以下文字,

+

并在终端输出:

!!.

但是,如果我取出两个for循环The number of lines: 2 The number of words: 5 The number of characters: 7 (c < 'A' && c > 'Z'),那么输出就会变为

(c < 'a' && c > 'z')

解决此问题的任何提示(我不想要答案!)?

2 个答案:

答案 0 :(得分:1)

你的if必须是这样的:

if ('a' <= c && c <='z'){character++;}
else if ( 'A' <= c && c <='Z'){character++;}

答案 1 :(得分:1)

解决问题的最简单方法是在字符位于间隔“a”和“z”或间隔“A”和“Z”之间时增加字符计数器,然后,因为转义序列'\ n'创建一个新行,这也意味着你正在处理一个新单词,因此你也应该增加这个计数器。最后,您可以检查空格或水平制表符以增加新的字计数器。

if ((c <'a' && c >'z') || ( c <'A' && c >'Z')){
   ++character;  
}
else if (c == '\n'){
   ++newline;
   ++newword;
}
else if (c == ' ' || c == '\t'){
   ++newword;
}