2015-02-20 5 views
0

Я пытаюсь разработать этот счетчик слов (вместе с линией и счетчиками символов). Правила состоят в том, что все это слово, кроме всего, что разделено пробелами, вкладками, новыми строками, точками с запятой и дефисом. Например: 'xyz' 'go; down' 'hey..howareyou' все 1 слово каждый, и 'эй: ты' tacos-burrito 'каждый 2 слова.Счетчик слов, получающих отрицательное значение в C

Мой подход заключается в следующем:

#include <stdio.h> 
#include <stdlib.h> 

int main(){ 

    int charHolder, result, wordCount, lineCount = 0; 

    int recursiveSeparatorCheck(charOther){ 
     if(isspace(charOther)||charOther=='\t'||charOther=='\n' || charOther ==':' || charOther == '-') 
      return 1; 
     return 0; 
    } 


    while ((charHolder = getchar()) != EOF){ 
     if(charHolder == '\n') 
      lineCount++; 
     result++; 
     if(recursiveSeparatorCheck(charHolder) == 1) 
      continue; 
     wordCount++; 


    } 


    printf("Number of char: %d \n", result); 
    printf("Number of lines: %d \n", lineCount); 
    printf("Number of words: %d \n", wordCount); 
    return (EXIT_SUCCESS); 
} 

Когда я запускаю свою программу, и кормить его, чтобы прочитать файл, который имеет 20 линий и 160 слов, он печатает следующее:

Number of char: 1130 
Number of lines: 20 
Number of words: -4195164 

ли кто-нибудь знает, что я делаю неправильно? Спасибо за вашу помощь!

+5

Вы забыли инициализировать все переменные, но 'lineCount'. Запуск вашей программы через Valgrind может помочь вам найти такие ошибки. Кроме того, вам нужно '#include '. Наконец, 'int recursiveSeparatorCheck (charOther)' должен быть 'int recursiveSeparatorCheck (int charOther)'. – 5gon12eder

+1

Просто примечание, но вы можете заменить все свое предложение long if на 'strchr (" \ t \ n: - ", charOther)! = NULL'. –

+0

, если в коде было указано только одно объявление переменной на строку, эта проблема никогда бы не произошла. Это связано с тем, что «только потому, что конкретная последовательность кода может быть написана/соблюдена, не означает, что она должна использоваться. Это также яркий пример того, почему все локальные переменные должны быть инициализированы в декларации – user3629249

ответ

1

Вы должны попробовать это:

int charHolder = 0, result = 0, wordCount = 0, lineCount = 0; 
3

кажется, что вы находитесь под впечатлением, что эта линия инициализирует все четыре переменные 0:

int charHolder, result, wordCount, lineCount = 0; 

Это не делает. Только lineCount инициализируется, остальные имеют неопределенные значения. Добавьте = 0 после wordCount и result, чтобы инициализировать их.

2

wordCount не инициализирован, содержит неопределенное значение, вам нужно явно инициализировать его 0, а также всех других переменных

int charHolder, result, wordCount, lineCount = 0; 

только инициализацию lineCount, для его работы вам нужно что-то вроде этого

int charHolder, result, wordCount, lineCount; 
charHolder = result = wordCount = lineCount = 0; 

, который мне совсем не нравится, но кажется, что это то, что вы имели в виду.

Примечание: Вам действительно необходимо использовать предупреждения компилятора.