1

以下のコードが Windows OS で異なる出力を与えるのはなぜだろうと思っていました。一方、同じコードは Ubuntu でもうまく機能します。

#include <iostream>
#include <cstring>

using namespace std;

string getname(void);
char getgender(string);
void setinfo(string,char);

int main()
{
    string customer = "";
    char gender;
    do {
        do{
            customer = getname();
        }while(customer =="");
        do{
            gender = getgender(customer);
            cout << "Gender in Main block is: " << gender << endl;
        }while(gender != 'm' && gender != 'f');
        setinfo(customer,gender);
        break;
    }while(1);
    return 0;
}

string getname(void)
{
    string name = "";
    cout <<"Please Enter your Name: " ;
    getline(cin,name);
    if(name == ""){
        cout << "Error: Name cannot be empty" <<  endl;
    }
    return name;
}

char getgender(string name)
{
    char gender;
    string strgender;
    cout << "Male / Female[m/f]: ";
    getline( cin,strgender);
    gender = strgender[0];
    strgender.clear();
    gender = tolower(gender);
    if(gender == 'm' || gender == 'f'){
        cout << "Gender in getgender() is: " << gender << endl;
        return gender;
    }
    else
        cout <<"Error: Must be m/ f" << endl;
}

void setinfo(string customer, char gender)
{
    string prefix;
    if(gender == 'm')
        prefix =  "Mr.";
    else
        prefix = "Ms/Mrs.";
    cout << "Hello " << prefix << " " << customer << endl;
    cout << "Welcome to TOWER HEIGHT" << endl;
}

私の Ubuntu マシンでは、このコードは正常に動作します。しかし、Windows でコンパイルして実行すると、別の出力が得られ、getgender() でループし続けます。

    Please Enter your Name: My Name
    Male / Female[m/f]: m
    Gender in getgender() is: m
    Gender in Main block is: ╕

    Male / Female[m/f]: f
    Gender in getgender() is: f
    Gender in Main block is: ╕

    Male / Female[m/f]:
4

2 に答える 2

5

が無効な値に設定されているgetgender()場合、関数は値を返さずに終了しgenderます。これにより、コンパイラがその関数に対して不適切なコードを生成する可能性があります。最後に「return 0」を追加して修正してみてください。

-Wallちなみに、(コンパイラ フラグを使用して) Linux システムで警告をオンにする必要があります。それは問題をすぐに明らかにしたでしょう:

example.cpp: In function ‘char getgender(std::string)’:
example.cpp:54: warning: control reaches end of non-void function
于 2012-05-21T06:24:13.423 に答える
-2

このコードを MSVC 2010 でコンパイルしたところ、正常に動作しました。どのコンパイラを使用していますか?

于 2012-05-21T06:15:22.133 に答える