Жалоба компилятора
Невозможно передать значение, возвращаемое функцией, которая не возвращает значение, в другую функцию (отсюда и сообщение об ошибке void
и const char *
).
Поскольку lowerCase()
не возвращает значение (его тип возврата void
), вы не можете сделать:
strcmp(lowerCase(input), answers[i]);
Вы бы использовали:
lowerCase(input);
int result = strcmp(input, answers[i]);
В качестве альтернативы, измените lowerCase()
, чтобы он возвращал char *
и завершите его return s;
(и тогда вам не нужно менять вызов на strcmp()
).
Переписать lowerCase()
Поскольку вы включаете <ctype.h>
, вы можете написать:
void lowerCase(char s[])
{
int c = 0;
while (s[c] != '\0') {
if (isupper((unsigned char)s[c])) {
s[c] = tolower((unsigned char)s[c]);
}
c++;
}
}
или:
char *lowerCase(char s[])
{
for (int c = 0; s[c] != '\0'; c++)
s[c] = tolower((unsigned char)s[c]);
return s;
}
Приведения необходимы в случае, если обычный char
подписанный тип. Функции из <ctype.h>
принимают int
, которое является либо EOF, либо значением символа, преобразованного в unsigned char
.
Нет необходимости проверять, является ли символ ниже дело; функция tolower()
оставляет все, что не является прописными, без изменений - и дополнительное преимущество использования функций.
Другие проблемы
У вас есть 3 элемента в questions
и answers
, но вы инициализируете только один элемент каждого. Когда вы вводите l oop в индекс 1, вы получаете нулевые указатели - следовательно, address = 0x0
в сообщении об ошибке. Вы пытались читать с нулевого указателя; после этого обычно происходят сбои.
Кроме того, sizeof(questions)
почти наверняка равно 24 - количество байтов, необходимое для хранения трех 64-битных указателей. Вам нужно sizeof(questions) / sizeof(questions[0])
для ограничения l oop - если вы добавите два дополнительных вопроса и ответа.
Поскольку вы преобразуете ввод во все строчные буквы, вы никогда не получите ввод, который соответствует ответ (в смешанном регистре).
Строка ответа хранится в строковом литерале. Если вы попытаетесь изменить ответ с помощью lowerCase()
, вы получите cra sh, потому что строковые литералы хранятся в постоянной памяти.