Сравнение между указателем и целым числом C ++ запрещено - PullRequest
4 голосов
/ 24 января 2020

Привет, так что я все еще изучаю C ++, и я столкнулся с проблемой при компиляции этой части моего кода. Прежде чем я go продолжу работу с текстовой игрой, которую я разрабатываю для проекта, я хотел бы знать, почему я получаю эту ошибку при попытке компиляции, чтобы я мог отлаживать при разработке.

ISO C ++ запрещает сравнение между указателем и целым числом [-fpermissive] if (answer1 == 'Yes' && answer1 == 'yes) {

Я не совсем уверен, где я иду не так потому что код сохраняет результат как «Да». (Я проверил, добавив std :: cout >> answer1; после сбора ответов пользователей y / n.)

, но когда я пытаюсь проверить это с помощью оператора If, я получаю эту ошибку.

    #include <iostream>

int main() {

  char name[50];
  char answer1[50];

  std::cout << "Ahh... Welcome newcomer. What is your name?\n";
  std::cin >> name;
  std::cout << "You said your name was " << name << " correct?\n";
  std::cin >> answer1;

    // Let the game begin!

  if (answer1 == 'Yes' && answer1 == 'yes') {

    std::cout << "Lets get this game started then!\n";

  }
  else {

    std::cout << "Then why are you even wasting my time?\n";
  }

}

Я знаю, что это основа c и рудиментарно, но я все еще учусь (самоучка тоже). Спасибо за чтение.

Ответы [ 2 ]

4 голосов
/ 24 января 2020

Переменная answer1 объявлена ​​как массив символов

char answer1[50];

В условии этого оператора if

if (answer1 == 'Yes' && answer1 == 'yes') {

указатель массива неявно преобразуется в указатель на его первый элемент (символ), имеющий тип char *.

С другой стороны, например, этот литерал 'Yes' является многобайтовым символьным литералом, который имеет тип int.

Таким образом, вы пытаетесь сравнить адрес первого символа массива с целым числом, имеющим значение, определенное реализацией. Очевидно, что это не имеет смысла.

Вам нужно использовать стандартную C функцию strcmp, которая объявлена ​​в заголовке <cstring>. И вместо символьных литералов используйте строковые литералы.

Также вы должны использовать логический оператор ИЛИ || вместо логического оператора И && внутри условия.

Например

#include <cstring>

//…

if ( strcmp( answer1, "Yes" ) == 0 || strcmp( answer1, "yes" ) == 0 ) {

Программа будет более безопасной, если вместо символьных массивов вы будете использовать стандартный класс std::string.

1 голос
/ 24 января 2020

Это: 'Yes' символьный литерал, а не строковый литерал. Многосимвольные литералы имеют определяемые реализацией значения типа int и не являются тем, что вы хотите использовать. Это неясная языковая функция, которая редко бывает полезна, но кажется, что она является обычным камнем преткновения для начинающих программистов.

Вы хотели бы это:

if (answer1 == "Yes" && answer1 == "yes")

за исключением того, что вы определили answer как массив символов. Сравнение будет скомпилировано, но не получится то, что вы хотите. Он будет сравнивать значения указателя char*, а не содержимое строк, и сравнение всегда будет неудачным.

Использование std::string, определенного в заголовке <string>, позволит выполнить сравнение, используя перегруженный оператор ==. (Для сравнения строк C в стиле, хранящихся в символьных массивах, вам придется использовать strcmp(), объявленный в <cstring>, но в C ++ это не имеет смысла).

...