为什么功能立即完成循环,然后再次运行?

时间:2014-03-14 04:51:01

标签: c++ string math cin

这是代码,我的输出,预期输出如下。

#include <iostream>
#include <string>
#include <sstream>
using namespace std;
class geometricShape
{
protected:
const double pi = acos(-1);
string userInputHeight = "";
string userInputRadius = "";
double height = 0;
double radius = 0;
public:
void setValues()
{
        while (true)
        {
        cout << "Please input the height: " << endl;
        getline(cin, userInputHeight);
        stringstream heightStream(userInputHeight);
        cout << "Please input the radius:" << endl;
        getline(cin, userInputRadius);
        stringstream radiusStream(userInputRadius);
        height = atof(userInputHeight.c_str());
        radius = atof(userInputRadius.c_str());
        if (heightStream >> height && radiusStream >> radius && height > 0 && radius > 0)
            {
            break;
        }
        cout << "Invalid input, please try again." << endl;
    }
 }
};
class cylinder : public geometricShape
{
public:
double volume()
{
    double radiusSquared = radius * radius;
    double cylinderVolume = pi*radiusSquared*height;
    return cylinderVolume;
}
};
int main(void)
{
int userInput = 0;
cout << "Please choose a volume to calculate: " << endl;
cout << "1. Cyliner." << endl;
cout << "2. Cone." << endl;
cin >> userInput;

switch (userInput)
{
case 1:
{
          //call right circular cylinder function
          cylinder cylndr;
          cylndr.setValues();
          cout << cylndr.volume() << endl;

          break;
}
case 2:
{
          cout << "case 2";
          break;
}
default:
{
           cout << "Invalid selection, please choose again." << endl;
}

}


cin.get();

}

当我按1代表Cylinder时,我期望发生的事情是它要求我&#34;请输入高度:&#34;然后等待响应,然后询问半径输入。

实际发生的是,它会立即打印出这两条消息,然后告诉我输入错误,然后第二次正确运行。

2 个答案:

答案 0 :(得分:2)

执行cin>>userInput时,它只读取流中的整数,并在流中保留换行符(当您按Enter键时)。你的getline函数读取直到它找到一行的结尾,该行已经存在于cin流中,因此你的userInputHeight被读取并包含一个空行。

所以你可以通过做这样的事情来修复你的代码

cin>>userInput;
cin.ignore();

这将忽略cin流中的所有内容,您可以继续使用代码。

有关cin.ignore的更多解释超过herehere

答案 1 :(得分:0)

只需使用cin >>

即可
    cout << "Please input the height: " << endl;
    cin >> userInputHeight;
    stringstream heightStream(userInputHeight);

如果您需要获得的不仅仅是第一个单词,也许您的意思是开头,请使用cin.getline()