2012-01-18 9 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'を使うことができます。 –

+0

@KeithThompson、うーん、私は今、返信がconst char [3]とconst char [4]の両方になれないことを理解していると思います。返信いただきありがとうございます。 – Xarlexus

0

replyは、if /他のブロックの範囲内で局所的に存在します。それらの外部にアクセスするには、そのスコープの外側で宣言する必要があります。

#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; 
} 
関連する問題