2014-02-28 115 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