2015-07-12 44 views
0

正如我聲明的結構數組:struct name data [5]; 當我嘗試使用cin.getline(data [i] .full_name,75)(我需要)進行輸入時,第一次跳過char輸入。我在這個網站上搜索並使用fgets,但沒用。 的代碼是:在結構中使用getline取char類型名稱

#include<iostream> 
using namespace std; 

struct name 
{ 
    char full_name[75]; 
    int number; 
}; 

void input(struct name data[]) 
{ 
    int i=0; 
    while(i<5) 
    { 
     cout<<"Enter the name: "; 
     fgets(data[i].full_name,75,stdin); 
        OR 
     cin.getline(data[i].full_name,75) 


     cout<<"Enter the number: "; 
     cin>>data[i].number; 
     i++; 
    } 
} 

int main() 
{ 
    int times=0; 
    struct name data[5]; 
    input(data);  
} 

回答

0

嗯,首先,你不能使用fgets()在這裏,在所有。 C庫的基於stdin的函數和C++庫的std::cin的混合結果未定義。

但你真正的問題是這樣的:

cin>>data[i].number; 

你這裏的意圖是讀取一行包含了一些文字。

如您所知,每行文本都以換行符終止。

>>運算符將讀取輸入的數字,但它實際上不會讀取它後面的換行符。

作爲一個結果,在循環的下一次迭代:

cin.getline(data[i].full_name,75) 

所有這一切將盡,然後,立即輸入號碼後閱讀而不是文本的下一行的換行符, 。

您將需要與其他getline取代您的>>運營商的使用()讀取文本的下一行成std::string,然後用std::istringstream將其轉換爲數字。

這是最乾淨的實施。還有其他一些可能性,例如在數字之後手動讀取新行字符,或者另外撥打std::getline()。

1

這裏是我的建議,希望它能幫助:

void input(struct name data[]) 
{ 
    int i=0; 
    int number; 
    char asciNumber[75]; 
    while(i<5) 
    { 
     cout<<"Enter the name: ";  
     cin.getline(data[i].full_name,75);  
     cout<<"Enter the number: "; 
     cin.getline(asciNumber,75);  
     try 
     { 
      number = atoi(asciNumber); 
      data[i].number = number; 
     } 
     catch (...) 
     { 
      //cout << "error in number parsing" << endl; 
      // i think its important to check validity of std input\ 
     } 
     i++; 
    } 
}