我为什么要使用这个"而#34;在这里表达?这个表达意味着什么?

时间:2017-02-27 02:00:49

标签: c++ while-loop

我写了一个程序,询问用户要编目的汽车数量。该程序使用new创建一个包含许多汽车结构的动态数组。接下来,它应该提示用户输入每个结构的品牌和年份信息。

然而,我错过了#34; WHILE"表达之前。程序直接运行到最后。结果如下:

enter image description here

预期结果应为

enter image description here

发生了什么问题?当我需要用数字数据替换读取字符串时,我该怎么办?

以下是我的源代码:

#include <iostream>
#include <string>
 using std::string;
// create car structure
struct car
{
   string make;
   int year;
};

int main()
{
   using std::cout;
   using std::cin;
   using std::endl;

   int num;
   cout << "How many cars do you wish to catalog? ";
   cin >> num;
   while (cin.get() != '\n')
      ;

// create a dynamic array
   car * catalog = new car [num];

//store
   for (int i = 0; i < num; ++i)
   {
      cout << "Car #" << i + 1 << ":\n";
      cout << "Please enter the make: ";
      getline(cin, catalog[i].make);
      cout << "Please enter the year made: ";
      cin >> catalog[i].year;
      while (cin.get() != '\n')
          ;

    }

//display
  cout << "Here is your collection: \n";
  for (int i = 0; i < num; ++i)
  {
     cout << catalog[i].year << "  " << catalog[i].make << endl;
  }

  delete [] catalog;

  return 0;
  }

2 个答案:

答案 0 :(得分:0)

当您向std::cin输入内容时,始终会有'\n',因为您使用回车键结束输入。
当您调用cin >> num时,std::cin将仅提取数字,而不是尾随'\n'。因此,在此之后,尾随'\n'仍将出现在输入缓冲区中 当您在此之后致电getline时,它会读取(并弃置)'\n'

我的建议:不要混用std::cin.operator >>getline 即使两者都将提取并丢弃前导空格,getline始终将'\n'视为输入的结尾,并将提取并丢弃它。
另一方面,std::cin.operator >>不会读取'\n',并将其视为空格。

答案 1 :(得分:0)

While(cin.get()!='\n');

这行代码消除了输入缓冲区中的换行符。

但问题是什么?

因为这行

getline(cin, catalog [i].make);

该行有什么问题?

问题出在这里,getline()函数从输入缓冲区读取内容,直到找到'\ n'。执行上面的代码时

cin>>catalog[i].made

您将输入数字并按Enter键。但在这种情况下,'\ n'将保留在缓冲区中。如果'\ n'仍然在缓冲区中,那么getline()函数将读取'\ n'并且它将假定您输入了输入。但实际上没有数据被读取。

所以不要使用getline()代替

cin>>catalog[I].make;