Немного понятнее, если добавить (необязательные) фигурные скобки:
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;
}