2016-01-12 56 views
-5

我試着運行下面的代碼,但一次輸入後,其餘的輸入被初始化爲零,並自動顯示在屏幕上。我哪裏做錯了?此代碼運行不正常

#include<iostream> 
#define N 50 
using namespace std; 

struct movies_t 
{ 
    char title[60]; 
    int year; 
}user[N]; 

void printmovie(movies_t); 

int main() 
{ 

    for(int i = 0; i < N; i++) 
    { 
     cout << "Enter title: "; 
     cin.get(user[i].title, 60); 
     cout << "Enter year: "; 
     cin >> user[i].year; 
    } 

    cout << "\nYou have entered these movie: \n"; 
    for(int i = 0; i < N; i++) 
     printmovie(user[i]); 
    return 0; 
} 

void printmovie(movies_t m) 
{ 
    cout << m.title; 
    cout << " (" << m.year << ")\n"; 
} 
+0

這是C++而不是C =) –

+0

編輯標籤不能與C – xaxxon

+0

它與你沒有從CIN清理出的新行做..但我不記得如何解決它..像cin.flush()之類的東西。 – xaxxon

回答

1

的問題是,當你按下輸入的一年,第一部電影時,即進入(新行)後進入仍處於輸入緩衝區,所以當你下次調用cin.get(...)它會讀取換行,並認爲你輸入一個空行。

您需要告知cinignore該行的其餘部分包括換行符。

1

cin >> user[i].year; 

換行符執行之後仍留在輸入流。

下一次執行

cin.get(user[i].title, 60); 

遇到的第一個字符是換行符。發生這種情況時,設置的failbit。下面是從http://en.cppreference.com/w/cpp/io/basic_istream/get(重點煤礦)的一些信息:

4)讀取字符,並將它們存儲到字符數組,其第一個元素是s指出的連續位置。字符被提取並存儲直到任何下列情況發生:

  • n-1個字符已經被存儲

  • 的文件結束的條件在輸入序列中出現(setstate(eofbit)稱)

  • 下一個可用輸入字符c等於delim,由Traits::eq(c, delim)確定。此字符不提取(不像basic_istream::getline()

如果提取沒有字符,來電setstate(failbit)。在任何情況下,如果count>0,空字符(CharT()被存儲在數組的下一個連續的位置。

cinfailbit被設定後,沒有從cin讀取直到狀態由明確的清除來電cin.clear()

既然你沒有任何代碼來檢查的cin狀態並清除狀態在適當的時候,沒有在第一次迭代後讀取循環。

一種方法來解決這個問題是添加一行在閱讀年份後忽略流的內容。

cin >> user[i].year; 
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

而且,這是一個很好的做法,始終檢查流的狀態的IO操作之後,以確保你不會忽略任何錯誤。

for(int i = 0; i < N; i++) 
{ 
    cout << "Enter title: "; 
    cin.get(user[i].title, 60); 
    if (!cin) 
    { 
     cout << "Error reading title.\n"; 
     exit(1); 
    } 

    cout << "Enter year: "; 
    cin >> user[i].year; 
    if (!cin) 
    { 
     cout << "Error reading name.\n"; 
     exit(1); 
    } 

    // Ignore everything up to and including the newline character. 
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
} 
+0

工作,謝謝! – Ephraim