为什么我的程序会跳过cin> >在For循环的第一个循环之后?

时间:2017-02-03 20:25:14

标签: c++ for-loop cin

我的程序正确运行第一个For循环,然后在第二个和第三个循环中跳过Cin。然后当循环结束时,它继续计算第一个索引[0]的BMI,并正确地做到这一点并给出正确的答案,但是对于索引1和[2]没有任何内容,因为没有输入信息是因为跳过了cin。

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;

struct Patient
{
  double height;
  double weight;
  int age;
  bool isMale;
};


int main()
{
Patient Patients[3];

for (int i = 0; i < 3; i++) {
    cout << "Patient "<< i << " Height: ";
    cin >> Patients[i].height;
    cout << "Patient " << i << " Weight: ";
    cin >> Patients[i].weight;
    cout << "Patient " << i << " Age: ";
    cin >> Patients[i].age;
    cout << "Is Patient " << i << " Male True or False: ";
    cin >> Patients[i].isMale;
    cout << endl << endl;

   }

    cout << endl << endl;

    for (int i = 0; i < 3; i++) {
        float BMI = Patients[i].weight / (Patients[i].height *Patients[i].height);
        cout << "Patient " << i << " Has A BMI of: " << BMI << endl << endl;
      }

return 0;
 }

这是你可以在第一个循环后看到的所有cin被跳过的控制台,但第一个循环被正确存储,因为它计算了第一个索引的BMI:

2 个答案:

答案 0 :(得分:1)

您可以通过两种方式修复程序。

  1. 只需输入&#34; 0&#34;或&#34; 1&#34;在男/女问题而不是&#34;真&#34;或&#34; false&#34;。
  2. 更改此行并继续输入&#34; true&#34;或&#34; false&#34;:

    cin >> boolalpha >> Patients[i].isMale;
    
  3. 来源:

    Cin and Boolean input

    http://www.cplusplus.com/reference/ios/boolalpha/

答案 1 :(得分:1)

您看到循环结束时出现错误。您可以从迭代2和3中看到cin每次的行为方式不同。有一些错误状态标志来自ios,可以帮助您查看此处出现的问题。有关详细信息,请参阅iso::good。如果您添加这些支票:

for (int i = 0; i < 3; i++) {
cout << "Patient " << i << " Height: ";
cin >> Patients[i].height;
cout << "Patient " << i << " Weight: ";
cin >> Patients[i].weight;
cout << "Patient " << i << " Age: ";
cin >> Patients[i].age;
cout << "Is Patient " << i << " Male True or False: ";
cin >> Patients[i].isMale;
cout << cin.good() << '\n';
cout << cin.eof() << '\n';
cout << cin.fail() << '\n';
cout << cin.bad() << '\n';
cout << endl << endl;
}

cin不再是goodeof不是fail,而不是bad,您会看到什么。设置fail位时,cin将无效。因此,你看到了结果。查看链接中的图表,您会看到:

  

i / o操作的逻辑错误

您正在执行将“true”插入bool的i / o操作。单词true可能存储为字符数组或字符串,而不是布尔值。 cin应该如何将其转换为布尔值?您需要捕获输入并将其转换为bool或切换为使用可明确转换为bool的输入。

例如:

cout << "Is Patient " << i << " Male? (1 for Male, 0 for Female):";
cin >> Patients[i].isMale;

在这种情况下,cin10识别为整数,并且可以将整数转换为布尔值。 0是假的,其他一切都是真的。另一个选择是让库执行它并使用boolalpha。你可以阅读它here

这显示了一个更大的问题。如果我写“两点五”作为高度的答案会怎样?在这种情况下,我们可以假设用户方面有一些情报,但考虑这样的事情将有助于在将来编写更强大的代码。