2015-12-21 19 views
1

我們在C++中有一個任務,其中我們有關於多本書的存儲信息(作者姓名,職務,出版商等)。
在獲取書名或作者姓名的同時,我嘗試使用函數getline()以一個句子的形式輸入輸入,但是在執行時,它並不要求我標題(我打算這樣做)相反,它直接問我作者的名字。
下面是代碼:如何獲得多個句子作爲輸入在c + +?

#include<iostream> 
using namespace std; 

class BookInfo 
{ 
    public: 
    string title,author,publisher; 
    int price,stock_position; 
}; 

class Books 
{ 
    BookInfo b[10]; 
    int no_of_books; 

    public: 
     void getdata() 
     { 
      cout<<"Enter the number of books: "; 
      cin>>no_of_books; 
      for(int i = 0 ; i < no_of_books ; i++) 
      { 
       cout<<"Title: "; 
       getline(cin,b[i].title,'\n'); 
       cout<<"Author: "; 
       getline(cin,b[i].author,'\n'); 
       cout<<"Publisher: "; 
       getline(cin,b[i].publisher,'\n'); 
       cout<<"Price: "; 
       cin>>b[i].price; 
       cout<<"Stock Position: "; 
       cin>>b[i].stock_position; 
      } 
     } 
}; 

int main(void) 
{ 
    Books a; 
    a.getdata(); 
} 

這裏是輸出:

輸入的圖書數量:1

標題:作者:

+0

什麼是輸入數據,爲什麼不能你只需要使用CIN >> B [I] .title僞 –

+0

你的函數getline caputed第一個換行符(當你輸入書的數量時) – Transcendental

+0

如果有人輸入「3a」的書數量會發生什麼?它應該產生一個錯誤?應該忽略'a'嗎?應該把'a'當作作者嗎? (你需要在寫代碼之前確定你想要的代碼是什麼,並確保你編寫它來做你想做的事情!) –

回答

1

問題是,當cin >> no_of_books看到輸入流中的下一個字符是換行符,但沒有提取它時終止。然後std::getline被要求提取,直到換行,但這是流中的第一個字符,所以它只是直接停下來。

什麼,你可以用這個做取決於你想如何你的程序,如果用戶輸入這樣的行爲:

1老人和大海
海明威

在換句話說,用戶直接用標題跟蹤書的數量,而不用換行符。

對我來說,看起來你的應用程序是面向行的,因此應該在數字後忽略行上的所有內容。如果是這樣的話,你可以無視一切高達(包括)其後的換行符是這樣的:

cin >> no_of_books; 
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
+1

如果標題輸入同一行,這不會忽略標題作爲書的數量?你有什麼理由認爲這是理想的行爲? –

+0

@DavidSchwartz嗯,好點。我認爲這是理想的行爲的唯一原因是應用程序似乎針對交互式或基於行的輸入。 – Angew

+0

@DavidSchwartz其實我試圖學習使用dev C++的C++。所以輸入和輸出顯示在命令提示符類型的終端上(對不起,我沒有提到我是初學者:p) –

0

這是因爲換行符被髮送到您的第一個getline。在cin>>no_of_books;應該修復後添加cin.get()

0

cin>>no_of_books不消耗\n

所以你的下一個getline需要現在的空行。

相關問題