В вашем коде есть ряд ошибок, некоторые тривиальные, некоторые фундаментальные.Приведенный ниже код будет работать, и я добавил комментарии, где я внес изменения:
#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;
}