Сканирование строки несколько раз и печать числа согласных в каждой строке - PullRequest
0 голосов
/ 28 сентября 2019

Я пытаюсь написать функцию int count_consonants(char str[]) в c, которая определяет и возвращает количество согласных в данной строке.Затем из функции main() я хочу повторно ввести строку, а затем вызвать функцию count_consonants(char str[]), чтобы вывести число согласных в каждой введенной строке.Программа должна остановить выполнение, как только введенная строка станет пустой (содержит только \ n).Я не могу понять, в какой части я могу многократно вводить строки, а затем сохранять их по отдельности для подсчета согласных в каждой из введенных строк.

Вот так выглядит мой код: (я понимаю, что при вводе строки с циклом while единственная строка, которая будет 'сохранена', - это последняя строка, содержащая только \ n.) Как я могупочини это?

#include <stdio.h> 
#include <string.h> 

int count_consonants(char str[]){
    int count = 0;
    for(int i = 0; str[i] != '\n'; i++){
        if (str[i] != 'a' || str[i] != 'e' || 
            str[i] != 'i' || str[i] != 'o' || 
            str[i] != 'u' || str[i] != 'A' || 
            str[i] != 'E' || str[i] != 'I' ||
            str[i] != 'O' || str[i] != 'U' ||
            str[i] != ' ') {
                count++;
            }
    } 
    return count;
}

int main(){
    char str[100]
    while(str[0] != '\n'){
         fgets(str, sizeof(str), stdin);

    printf("Number of consonants=%d\n", count_consonants(str));

}

Вход должен выглядеть следующим образом:

Hello world
this 
last 

И вывод должен выглядеть следующим образом:

Number of consonants=7
Number of consonants=3
Number of consonants=3

1 Ответ

0 голосов
/ 28 сентября 2019

В вашем коде есть ряд ошибок, некоторые тривиальные, некоторые фундаментальные.Приведенный ниже код будет работать, и я добавил комментарии, где я внес изменения:

#include <stdio.h> 
#include <string.h> 

int count_consonants(char str[]) {
    int count = 0;
    for (int i = 0; str[i] != '\n'; i++) { // You need && in place of all || ...
        if (str[i] != 'a' && str[i] != 'e' &&
            str[i] != 'i' && str[i] != 'o' &&
            str[i] != 'u' && str[i] != 'A' &&
            str[i] != 'E' && str[i] != 'I' &&
            str[i] != 'O' && str[i] != 'U' &&
            str[i] != ' ') {
            count++;
        }
    }
    return count;
}

int main() {
    char str[100]; // You've missed the terminating ; here!
    while (str[0] != '\n') {
        fgets(str, sizeof(str), stdin);
        if (str[0] == '\n') break; // Jump out of the loop!
        printf("Number of consonants=%d\n", count_consonants(str));
    }
    return 0; // Always return an integer from main!
}

Кроме двух «опечаток» в функции main, вам необходимо внести серьезные изменения вкак ты считаешь согласные.В исходном коде тест if всегда будет верным, поскольку только одно из != сравнений может быть ложным.

РЕДАКТИРОВАТЬ: Позвольте мне уточнить!Давайте предположим, что первый символ в тестовой строке - это буква a (гласная, поэтому мы не хотим увеличивать count).В списке тестов (где i будет 0, поэтому я буду использовать этот индекс), согласно вашему коду , первое сравнение: str[0] != 'a' даст false (какожидается);однако все последующие сравнения , например, второе: str[0] != 'e' даст true (потому что это не e, а a), поэтому общее значение все тесты будут: false ИЛИ true ИЛИ true ИЛИ true ИЛИ ...;таким образом, будет введен блок if и счет будет увеличен.Это будет то же самое для любого символа: оно не может быть равно всем вашим тестам!

Однако, если вы используете те же тесты, но комбинируете их с &&, общая стоимость тестов будетбыть false, если любой из одиночных тестов - false.

Не стесняйтесь спрашивать о том, как объединить операторы сравнения || и &&.

В гораздо более сжатой реализации count_constants() используются функции обработки строк / символов, предусмотренные стандартом C:

int count_consonants(char str[]) {
    int count = 0;
    const char *UCconsonants = "BCDFGHJKLMNPQRSTVWXYZ";
    for (int i = 0; str[i] != '\n'; i++) {
        if (strchr(UConsonants, toupper(str[i])) != NULL) ++count;
    }
    return count;
}
...