2016-04-21 6 views
-2

Я новичок в программировании. Я пытаюсь написать программу, которая читает строки, слова и символы из текстового файла. Вот код ниже.Подсчет линий, слов и символов

#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); 
} 

Я пытался понять, как не читать специальные символы, такие как !, @, #, $, %, ^, &, *, (, ), _, +.

Я попытался использовать операторы if, чтобы он не читал специальные символы, но он читает его. Я думаю, что утверждение if для заглавных букв неверно, потому что оно, вероятно, не будет читать строчные буквы.

В файле следующий текст находится в нем,

!!. 

и выводит в терминале:

The number of lines: 2 
The number of words: 5 
The number of characters: 7 

Однако, если я беру два для петель (c < 'A' && c > 'Z') и (c < 'a' && c > 'z'), то выход будет

The number of lines: 2 
The number of words: 1 
The number of characters: 7 

Любые подсказки, чтобы исправить эту проблему (я не знаю я хочу ответ!)?

+1

'c <'a' && c > 'z'' always false. – BLUEPIXY

+2

Вкратце, вы не можете остановить программу от чтения пунктуации, если файл содержит знаки препинания. Вы должны иметь дело с этим. Вы можете решить, как считать это. Обычно слова отделяются друг от друга пробелом (пробелы, вкладки, символы новой строки и т. Д.). Все, что не является белым пространством, является частью «слова». Вы можете уточнить свой выбор - например, вы можете игнорировать пунктуацию. Вы должны посмотреть заголовок '' и функции (макросы), такие как 'isalpha()' и 'ispunct()' и 'isspace()'. –

+0

Вы также можете найти исходный код утилиты GNU 'wc' и посмотреть, как это работает. – paddy

ответ

1

Ваш, если должно быть что-то вроде:

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

Самый простой способ решить проблему заключается в повышении ваш счетчик символов, когда символ между интервалом «а» и «Z» или интервала «A 'и' Z ', а затем, поскольку escape-последовательность' \ n 'создает новую строку, это также означает, что вы имеете дело с новым словом, поэтому вы должны также увеличивать этот счетчик. И, наконец, вы можете проверить пространство или горизонтальную вкладку, чтобы увеличить счетчик новых слов.

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