Передача 'void' параметру несовместимого типа 'const char *'? - PullRequest
0 голосов
/ 11 марта 2020

Когда я запускаю приведенный ниже код, я получаю сообщение об ошибке «Передача void» параметру несовместимого типа «const char *» »в этой строке:

int result = strcmp(lowerCase(input), answers[i]);

Код, в котором находится ошибка is:

for (int i = 0; i <= sizeof(questions); i++)
{
    printf("%s", questions[i]);
    scanf("%s", input);

    int result = strcmp(lowerCase(input), answers[i]);
    if (result == 0)
    {
        score++;
    }
}

и lowerCase определяется как:

void lowerCase(char s[]) {

   int c = 0;

   while (s[c] != '\0') {

      if (s[c] >= 'a' && s[c] <= 'z') {

          s[c] = s[c] + 32;

      }

      c++;
   }
}

Весь код:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>             // strcmp() prototype is in here.
#include <ctype.h>

char *questions[3];
char *answers[3];

void fillQuestions(void);
void fillAnswers(void);

void lowerCase(char []);

int main(int argc, const char * argv[])
{
    fillQuestions();
    fillAnswers();

    char input[80];
    int score = 0;

    for (int i = 0; i <= sizeof(questions); i++)
    {
        printf("%s", questions[i]);
        scanf("%s", input);


        int result = strcmp(lowerCase(input), answers[i]);
        if (result == 0)
        {
            score++;
        }
    }
    printf("\n\tSCORE: %d\n\n", score);

    return 0;
}

void fillQuestions()
{
    questions[0] = "The famous basketball player Dr. J original name is what?";

}

void fillAnswers()
{
    answers[0] = "Julius Erving";

}

void lowerCase(char s[]) {

   int c = 0;

   while (s[c] != '\0') {

      if (s[c] >= 'a' && s[c] <= 'z') {

          s[c] = s[c] + 32;

      }

      c++;
   }

}

Я использую XCode 11.3.

1 Ответ

0 голосов
/ 11 марта 2020

Жалоба компилятора

Невозможно передать значение, возвращаемое функцией, которая не возвращает значение, в другую функцию (отсюда и сообщение об ошибке 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, потому что строковые литералы хранятся в постоянной памяти.

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