2017-02-27 112 views
-3

我写了一个程序,询问用户有多少辆汽车目录。该程序使用新创建一个动态阵列的许多汽车结构。接下来,它应该提示用户输入每个结构的制造和年份信息。为什么我应该在这里使用这个“while”表达式?那个表达意味着什么?

但是,我之前错过了“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; 
    } 
+0

那'while'声明跳到输入行结束的方式。 –

+0

用'cin.ignore(numeric_limits :: max(),'\ n')' – user4581301

+0

可能会节省一点时间(但不能打字)谢谢! @Captain Obvlious –

回答

0

当你输入的东西std::cin,时时会出现拖尾'\n',因为你最终用回车键输入。
当您调用cin >> num时,std::cin将只提取数字,而不是尾随'\n'。因此,在此之后,尾随'\n'将仍然存在于输入缓冲区中。
然后当您在此之后致电getline时,它将读取(并放弃)'\n'

我的建议:不要混合std::cin.operator >>getline
尽管两者都会提取并丢弃领先的空格,但getline将始终将'\n'作为输入的结尾,并将提取并丢弃它。
另一方面,std::cin.operator >>将不会读取'\n',并将它视为只是一个空白。

+1

哦,我明白了。比你非常! @Dannyu NDos –

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

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

但问题是为什么?

因为该行

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

什么是该行的问题?

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

cin>>catalog[i].made 

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

所以不要使用函数getline(),而不是

cin>>catalog[I].make; 
+0

其实在这一行我想输入字符串和getline()方法可能可以读取'\ n',对不对? –

+0

我知道你的意思。问题发生在cin >> num [ENTER]非常感谢! –

相关问题