Как считать гласные, согласные, цифры в текстовом файле с помощью перенаправления в C - PullRequest
0 голосов
/ 25 января 2019

Новый кодер C здесь.На моем первом C курсе в школе.У меня есть опыт работы с Java, но этот курс полностью на C. У меня есть домашняя работа по созданию программы, которая читает содержимое файла и подсчитывает количество букв в верхнем и нижнем регистре, гласных, согласных и цифр.Программа не должна иметь никаких аргументов, но примет перенаправление файла .txt из командной строки.У меня вопрос, как мне исправить мой текущий код, чтобы читать из стандартного ввода каждого символа файла, будь то буква или цифра?Я действительно борюсь с тем, как читать содержимое файла со стандартного ввода, читать каждый символ и затем решать, к какой категории он принадлежит. Любая помощь будет принята с благодарностью.Благодарю.

Я буду запускать программу, подобную этой ...

$ program

Где testFile.txt будет содержать следующий текст:

abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789

int upper = 0;  // Number of upper case letters
int lower = 0;  // Number of lower case letters
int vowel = 0;  // Number of vowels
int consonant = 0;  // Number of constants
int digits = 0; // Number of digits
int total = 0;  // Total number of characters in file
int i =0;

char value[100];

fgets(value, 100, stdin);

while(value[i] != '\0');
{


    if (value[i] >= 'A' && value[i] <= 'Z')
    {
        upper++;

        if (value[i] == 'A' || value[i] == 'E' || value[i] == 'I' || value[i] == 'O' || value[i] == 'U' || value[i] == 'Y')
        {
            vowel++;

        }
        else {

            consonant++;

        }
    }

    else if (value[i] >= 'a' && value[i] <= 'z')
    {
        lower++;

        if (value[i] == 'a' || value[i] == 'e' || value[i] ==      'i' || value[i] == 'o' || value[i] == 'u' || value[i] == 'y')
        {
            vowel++;

        }
        else {

            consonant++;
        }

    }

    else if (value[i] >= '0' && value[i] <= '9')
    {
        digits++;

    }

    total++;
    i++;

}

printf("upper-case: %d", upper);
printf("\nlower-case: %d", lower);
printf("\nvowels: %d", vowel);
printf("\nconsonants: %d", consonant);
printf("\ndigits: %d", digits);
printf("\ntotal: %d", total);
printf("\n");

return 0;

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

Ответы [ 2 ]

0 голосов
/ 25 января 2019
while(value[i] != '\0');

Это ваша самая очевидная проблема, в основном это означает:

while value[i] != '\0':
    do nothing
end while

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


Есть другие проблемы, такие как тот факт, чтовы будете обрабатывать только первую строку, а не весь файл.Сама идея использования fgets и обработки строки не нужна, когда вы можете просто начать со следующего скелета фильтра:

int ch;
while ((ch = getchar()) != EOF) {
    /* process ch */
}

Это будет обрабатывать весь файл символ за символом, пока не будут выполнены все символы (илипока не возникнет ошибка) так что вы можете просто настроить цикл тела, чтобы сделать то, что вам нужно - вы в основном сделали этот бит в своем коде с циклом над символами строки.

Я бы предложил не с использованием следующего кода (поскольку это классная работа), но вы также можете лучше использовать конструкции управления потоком и библиотечные функции (из ctype.h и string.h), что-то вроде:

while ((ch = getchar()) != EOF) {
    // Lib functions to detect upper/lower-case letters.

    if (isupper(ch)) {
        ++upper;
    } else if (islower(ch))
        ++lower;
    }

    // And to detect letter/digit type.

    if (strchr("aeiouAEIOU", ch) != NULL) {
        ++vowel;
    } else if (isalpha(ch)) {
        ++consonant;
    } else if (isdigit(ch)) {
        ++digits;
    }

    ++total;
}

Это особенно важно, так как нет никакой реальной гарантии, что нецифровые символы будут последовательными.

0 голосов
/ 25 января 2019

Удалить точку с запятой после оператора while. : -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...