2014-02-28 152 views
1

我想要使用getline(),但是在输入第一个记录之后,不要等到第二个国家名称跳过并跳到大写名称上。我的错误在哪里?如果我进入Getline跳到下一个cin并跳过前一个cin

国家:印度
首都:新德里
资本:57382
它把这些值没有任何问题,但光标不会等待下一次直接进入人均值后资本跳跃国家。

#include<iostream.h> 
#include<conio.h> 
#include <string.h> 
struct country 
{ 
char nm[30]; 
char capital[30]; 
float income; 
}; 

void main() 
{ 
    country c[5]; 
    clrscr(); 
    for(int i=0; i<5 ; i++) 
    { 
    cout << "\n Country's name : "; 
    cin.getline(c[i].nm, 30); 
    cout << "\n Country's capital :"; 
    cin.getline(c[i].capital,30); 
    system("cls"); 
    cout << "\n Per capita income :"; 
    cin >> c[i].income; 
    } 

我通过添加cin.ignore修改的码();

for(int i=0; i<5 ; i++) 
    { 
    cout << "\n Country's name : "; 
    cin.getline(c[i].nm, 30); 
    cin.ignore(); 
    cout << "\n Country's capital :"; 
    cin.getline(c[i].capital,30); 
    cin.ignore(); 
    cout << "\n Per capita income :"; 
    cin >> c[i].income; 
    cin.ignore(); 
    } 

但之后getline()等待下一个国家,但它现在正等待国家,资本和Capita的每个条目。意味着我进入

国家:印度//按回车键//等待,我按在此处输入
首都:新德里//按回车键//等待,我按在此处输入
人均: 32323 //新闻输入//等待,然后我按这里输入

相同的5次。

回答

1

因为cin >>不会消耗您键入的数字后面的换行符。这些字符保留在输入缓冲区中。下次调用getline()时,它会找到换行符,并假定用户只需按Enter即可输入一个空字符串。

+0

我讨论了这个问题,并添加了cin.ignore(),但现在出现了一个不同的问题,请看编辑过的帖子 – Vishal

+1

@Vishal你错过了'ignore()'调用。应该只有一个,它应该在* first *'getline()'调用之前。此外,最好是'std :: cin >> std :: ws'而不是'ignore()',因为你只是试图放弃空格。 – 0x499602D2

+0

@ 0x499602D2感谢您的指导,它的工作原理。 – Vishal