2016-12-15 9 views
-5

こんにちは、私はこのシンプルなプログラムを作っていますが、入力されたブック名を取るのにいくつかの問題があり、プログラムはcin.get()関数をスキップして、エラーがないのに動作しない理由はわかりません。どんな助けもありがとう。cin.get()が文字配列のために機能していない

#include<iostream> 
using namespace std; 
struct book 
{ 
private: 
int bookid; 
char name[30]; 
float price; 
public: 
input() 
{ 
    cout<<"\n Enter book ID: "; 
    cin>>bookid; 
if(bookid<0) 
{ 
    bookid = -bookid; 
} 
    cout<<"\nEnter book title: "; 
    cin.get(name,30); // here is the problem 
    cout<<"\nEnter book price: "; 
    cin>>price; 
} 
display() 
{ 
    cout<<"\nBook ID: "<<bookid<<"\nbook title: "<<name<<"\nprice: "<<price; 
} 
}; 

int main() 
{ 
book b1; 
b1.input(); 
b1.display(); 


return 0; 
} 
+0

働いていないとはどういう意味ですか? – NathanOliver

+0

具体的には何が_うまくいきませんか? Stack Overfowで質問するときは、常にすべてのエラーメッセージ、入力、予想される出力を含む[MCVE]を投稿してください。 –

+0

私はそれを実行するときにcin.get()関数をスキップ – Waleed

答えて

0

は、(複数の単語の文字列)(シングル単語列のための)cin >> name;を使用し、その後、namestringではなく文字列を作ってみましょうかcin.getline(name);お願いします。プログラムの先頭に#include <string>を追加する必要があります。

一般に、C++では文字配列を使用しないでください(これはC言語のものです)。


編集:私はあなたの問題がここにある

思う:

cin >> bookid;が、それは入力ストリームに'\n'を検出したとき、停止して、ストリームにその\nを残します。その後、直後にcin.getline(name);を呼び出すと、最初に読み込まれる文字は'\n'であるため、「行が読んでいる」ためすぐに戻ります。これはcin >>cin.getline()の違いです。

解決策は、cin.getline(name)を置き換えることです。それは実際の名前を含む行を読む前に(不要な'\n'に先行する他の空白を含む)単一'\n'を取得し、破棄します方法

cin.getline(); 
cin.getline(name); 

と。あなたは非常に次の文字が'\n'はなく'\n'に続く他の空白のいくつかの量であるという事実を知っている場合

、その後、あなただけの非常に次の文字、すなわち'\n'を無視するcin.ignore();を行うことができます。

+0

あなたの素敵な説明のために、ありがとう、概念を得ました。 – Waleed

関連する問題