2012-01-18 47 views
2

我知道很多人之前都有这个错误,但是我刚开始用C++编程,所以我对大部分命令还没有确定。'reply'没有在此范围内声明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

回答

3

这是一个更清楚一点,如果您添加(可选)括号:

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,它重载==以具有字符串比较语义。

一个更清洁,你的程序的correcter版本看起来可能是这样:

#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

@Xarlexus:你不能,至少没有直接。 'reply'的类型为'const char [3]'或'const char [4]';它不能同时成为两者。你可以使它成为一个const char *而不是一个数组(这意味着'sizeof reply'给你一个指针的大小,而不是数组的大小)。或者,由于您使用C++进行编程,因此可以使用'std :: string',它更健壮,更灵活。 – 2012-01-18 04:24:39

+0

@KeithThompson,嗯,我认为我现在明白了如何回复不能同时是const char [3]和const char [4]。感谢回复。 – Xarlexus 2012-01-18 04:40:20

0

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

0

还有就是在每个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

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; 
}