'ответ' не был объявлен в этой области C ++ - PullRequest
2 голосов
/ 18 января 2012

Я знал, что многие люди раньше получали эту ошибку, но я только начал программировать на C ++, поэтому пока не уверен в большинстве команд.

Я пытаюсь создать программусо следующим исходным кодом:

#include <iostream>

int main()
{
char input[7];

std::cout << "Enter your gender (male or female):";
std::cin.getline (input, 6);

if (input == "male")
char reply[] = "Mr";

else
char reply[] = "Mrs";

std::cout << "Hello " << reply << "!\n";

return 0;
}

Теперь, когда я пытался скомпилировать это с помощью моего компилятора (G ++).Я получил эту ошибку:

StringTest.cpp: In function 'int main()':
StringTest.cpp: 16:26: error: 'reply' was not declared in this scope

Подскажите, пожалуйста, что именно пошло не так с моим кодом?И как мне попытаться решить ее?

Спасибо, Xarlexus

Ответы [ 4 ]

3 голосов
/ 18 января 2012

Немного понятнее, если добавить (необязательные) фигурные скобки:

if (input == "male")
{
    char reply[] = "Mr";
}
else
{
    char reply[] = "Mrs";
}

std::cout << "Hello " << reply << "!\n";

reply перестает существовать в }, заканчивающем блок, в котором он объявлен. Итак, здесь, reply не существует, когда вы пытаетесь распечатать его.

Решение здесь состоит в том, чтобы объявить reply вне блоков, а затем присвоить ему из блоков:

char const* reply(0);

if (input == "male")
{
    reply = "Mr";
}
else
{
    reply = "Mrs";
}

std::cout << "Hello " << reply << "!\n";

Таким образом, reply все еще находится в области видимости (и все еще существует) в последней строке при его печати. ​​


Обратите внимание, что, хотя ваша программа теперь может компилироваться, она по-прежнему неверна. input == "male" не делает то, что вы думаете: input и "male" становятся указателями на строки C, и сравниваются указатели, а не содержимое указанных строк. Вам нужно использовать функцию сравнения строк или, что еще лучше, использовать std::string, которая перегружает ==, чтобы иметь семантику сравнения строк.

Более чистая, корректирующая версия вашей программы может выглядеть так:

#include <iostream>

int main()
{
    std::string input;

    std::cout << "Enter your gender (male or female):" << std::endl;

    if (!std::getline(std::cin, input))
    {
        std::cout << "Oops, something bad happened during input!" << std::endl;
        return 0;
    }

    std::string reply;
    if (input == "male")
    {
        reply = "Mr";
    }
    else if (input == "female")
    {
        reply = "Mrs";
    }
    else
    {
        std::cout << "Your selection was invalid" << std::endl;
        return 0;
    }

    std::cout << "Hello " << reply << "!" << std::endl;
    return 0;
}
0 голосов
/ 18 января 2012

input == "male - бессмысленное сравнение, поскольку оно никогда не будет правдой. input - это массив, который затухает до указателя на первый элемент. С этого момента это сравнение указателей (то есть, input и "male" по одному и тому же адресу?), Что просто не будет истинным.

Вы хотите std::string вместо:

#include <iostream>
#include <string> // <== add this

int main()
{
  std::string input; // <== change type of 'input'

  std::cout << "Enter your gender (male or female):";
  std::getline(std::cout, input); // <== use free function version

  char const* reply;
  if (input == "male") { // <== now does the correct comparision
    reply = "Mr";
  }
  else {
    reply = "Mrs";
  }
  std::cout << "Hello " << reply << "!\n";

  return 0;
}
0 голосов
/ 18 января 2012

В каждом операторе if / else есть неявный блок, поэтому ваш код читает:

if (input == "male") {
   char reply[] = "Mr";
} else {
   char reply[] = "Mrs";
}

//  reply is not defined in this scope

То, что вы действительно хотите, это что-то вроде этого:

const char *reply;

if (input == "male")
  reply = "Mr";
else 
  reply = "Mrs";

Хотя я бы лично написал это так:

const char * reply = (input == "male") ? "Mr" : "Mrs";

Также обратите внимание, что я бы использовал const char * вместо char [], поскольку я предполагаю, что типичное использование - это неизменяемая строка, а не char [], который является изменяемым.

0 голосов
/ 18 января 2012

reply существует локально в рамках блоков if / else. Чтобы получить к нему доступ вне их, вы должны объявить его вне этой области.

#include <iostream>
#include <string>
int main()
{
  std::string input;

  std::cout << "Enter your gender (male or female):";
  stdgetline(cin, input);

  std::string reply;
  if (input == "male") {
    reply = "Mr";
  }
  else {
    reply = "Mrs";
  }
  std::cout << "Hello " << reply << "!\n";

  return 0;
}

Обратите внимание, что этот фрагмент в вашем исходном коде не выполняет то, что вы ожидаете: if (input == "male"). Вы сравниваете указатели, когда вы собираетесь сравнивать строки. Предпочтительно использовать std::string или даже strcmp.

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