C ++ getline和if / else if语句不按我的意图工作

时间:2013-06-28 00:50:48

标签: c++ string pointers getline if-statement

我最近开始学习C ++。我写了这个程序,根据用户输入输出数字。在我要求用户确定输出的整数之前,我发现我可以使用getline从用户那里获取一个字符串。我的问题是,现在无论用户输入什么,程序总是在输出其他东西时输出26.2。如何只输入“apple”输出26.2,只输入“orange”输出12.9,只输入“kiwi”输出62.6等?

#include <iostream>
#include <string>

using namespace std;

struct fruit {
    float apple;
    float orange;
    float kiwi;
    float tangerine;
    float grape;
    int banana;
};

int main()
{
    string apple, orange, kiwi, tangerine, grape, banana;

    fruit percentage;
    fruit *ptr;

    percentage.apple = 26.2;
    percentage.orange = 12.9;
    percentage.kiwi = 62.6;
    percentage.tangerine = 18.3;
    percentage.grape = 41.8;
    percentage.banana = 13;
    ptr = &percentage;

    cout<<"Information from the USA in 2004.\n1. apple 2. orange 3. kiwi 4. tangerine 5. grape 6. banana\n";

    if ( getline ( cin, apple ) ) {
        cout<< ptr->apple;
        cin.get();
    }
    else if ( getline ( cin, orange ) ) {
        cout<< ptr->orange;
        cin.get();
    }
    else if ( getline ( cin, kiwi ) ) {
        cout<< ptr->kiwi;
        cin.get();
    }
    else if ( getline ( cin, tangerine ) ) {
        cout<< ptr->tangerine;
        cin.get();
    }
    else if ( getline ( cin, grape ) ) {
        cout<< ptr->grape;
        cin.get();
    }
    else if ( getline ( cin, banana ) ) {
        cout<< ptr->banana;
        cin.get();
    }
    else {
        cout<<"Error, invalid input.";
        cin.get();
    }
}    

1 个答案:

答案 0 :(得分:2)

你永远不会进行比较。你的if语句只说if (getline(...))getline()函数接受流和结果字符串并再次返回流。我们以你的第一行为例:

if ( getline ( cin, apple ) ) {

getline(cin, apple)将从cin(用户输入)获取下一行,并将其复制到字符串apple中。然后它将返回cin。由于cin现在是if语句中的返回值,因此if语句会检查它是true还是false。显然,cin既不是,但系统将其解释为true并始终执行您的第一个语句。

现在,关于如何解决这个问题。您需要在程序开头获取一次输入,例如:

string in;
getline(cin, in);

然后在if语句中比较该变量。

if (in == "apple") {
    // Do stuff for apples
} else if (in == "orange") {
    // Do stuff for oranges
} // etc