2009-04-30 6 views
0

私は、C++の学習を練習するための個人的な使い方のための小さなプログラムを作成しています。その機能のために、MLAの引用ジェネレータ(私は数十の引用を含む大きなペーパーを書いています)です。C++のstd :: cinオブジェクトのルールは何ですか?

私はクラスを理解していないか、メインの中の他の.cppファイルを使用していないので、私には気にしないでください。私は、引用の種類ごとに関数を書いています。私が時間を増やせば、再利用されたコードごとに関数に分解する可能性があります。

私の質問です:std :: cinオブジェクトはどのように機能しますか?私は現在、std :: cin >>でシングル・ワードとなる文字列を読み込み、getline(std :: cin、string)という文字列をスペースで読み込みます。私は正しい出力を得ていない。私はちょうどstd :: cinがどのように動作するのか知りたかったのですが、なぜ私は予期せずにいくつかの入力をスキップしてしまいました。(例えば、Webページを読み飛ばす代わりにスキップします。

void webCit() 
{ 
std::cout << "Leave any unknowns blank.\n"; 

std::cout << "Author last name: "; 
std::string lastName; 
std::cin >> lastName; 

if (lastName.size() != 0) 
{ 
    lastName = lastName + ", ";  
} 


std::cout << "Author first name: "; 
std::string firstName; 
std::cin >> firstName; 

if (firstName.size() != 0) 
{ 
    firstName = firstName + ". "; 
} 


std::cout << "Article title: "; 
std::string articleTitle; 
getline(std::cin, articleTitle); 

if (articleTitle.size() != 0) 
{ 
    articleTitle = "\"" + articleTitle + ".\" "; 
} 

std::cout << "Title of web page: "; 
std::string pageTitle; 
std::cin >> pageTitle; 

if(pageTitle.size() != 0) 
{ 
    pageTitle = pageTitle + ". "; 
} 

std::cout << "Publication date: "; 
std::string publicationDate; 
getline(std::cin, publicationDate); 

if(publicationDate.size() != 0) 
{ 
    publicationDate = publicationDate + ". "; 

} 

std::cout << "Web address: "; 
std::string webAddress; 
getline(std::cin, webAddress); 

webAddress = "<" + webAddress + ">. "; 

std::cout << "Date accessed: "; 
std::string dateAccessed; 
getline(std::cin, dateAccessed); 

if(dateAccessed.size() != 0) 
{ 
    dateAccessed = dateAccessed + ". "; 
} 

std::string citation = 
    lastName + firstName + articleTitle + pageTitle + publicationDate + webAddress + dateAccessed; 

std::cout << citation; //TEST; remove after 
} 

EDIT:あなたが見ることができるように、私の入力はスキップなっているので、I/O

Leave any unknowns blank. 
Author last name: Hooked 
Author first name: Jerbear 
Article title: Title of web page: title 
Publication date: Web address: www.win.com 
Date accessed: 4/29/09 
Hooked, Jerbear. Title. <www.win.com>. 4/29/09. 

、何かが、間違って起こっています。

+0

私はあなたがこれをやっている方法で明らかな問題は表示されません...コピーして、彼のプログラム、あなたが持っている正確な入力と出力? また、「using namespace std;」を入れることをおすすめします。 (通常はあなたの#includeの直後にある)トップで、std ::を何度も書く必要なしに "cin"と "cout"と言うことができます。しかし、もちろん、どちらにしても...必要はありません。 – MatrixFrog

+0

I/Oを追加しました。 – jkeys

+0

@MatrixFrog:私は 'std :: cinを使います。 std :: coutを使用します。 ...を使用するか、グローバルレベルではなく、それを使用する関数の中で 'using namespace std;'を使用します。 –

答えて

6

std::cin >> firstName;だけまで読んだときは、改行(または'\n')が含まれ最初の空白文字を含まない、ということであるEnterキーを押すと、それはgetline(std::cin, articleTitle);になったときに、そう、'\n'はまだ隣にあり文字はstd::cinで、getline()はすぐに戻ります。

// cin = "Bloggs\nJoe\nMan of Steel, Woman of Kleenex\n" 
std::cin >> lastName; 
std::cin >> firstName; 
// firstName = "Joe", lastName = "Bloggs", cin = "\nMan of Steel, Woman of Kleenex\n" 
getline(std::cin, articleTitle); 
// articleTitle = "", cin = "Man of Steel, Woman of Kleenex\n" 

追加「std::cin >> std::ws」(ws意味wハイトsペース)のgetline()へのあなたの呼び出しの前に、問題修正:

std::cin >> firstName >> std::ws; 
getline(std::cin, articleTitle); 

をしかし、あなたがしなければ、あなたがそれを逃したところ、見ることが容易ですそれは引数の中に:

std::cin >> firstName; 
getline(std::cin >> std::ws, articleTitle); 
+0

私はちょうど約wsを追加しようとしていた:P – sfossen

+0

これは、*ではない*複数のcin >> sの何が起こるか! –

+0

@Jesse:ああ、私はあなたが「複数の映画」について何を意味しているのか見ています。それは同じように振る舞います。 –

2

>>演算子を使用すると、cinは次の空白文字まで読み取りますが、空白は処理されません。だから、あなたが持っているとき

std::cin >> str1; 
std::getline(std::cin, str2); 

2番目の呼び出しは改行文字を処理するだけで、入力を入力する機会はありません。

代わりにoperator >>の後にgetlineを使用する予定の場合は、getlineに電話する前にstd::cin.ignore()に電話して改行を食べることができます。

編集:2番目の呼び出しは、すべての先頭の空白を無視しますので、あなたが

std::cin >> str1; 
std::cin >> str2; 

を行うときに、あなたが期待どおりに動作します。ここで何が起こっている

+1

また、演算子>>とgetlineは両方とも、入力値の読み込みに成功した場合は真であるブール値と互換性のある値を返し、エラー、ファイルの終わり、または書式設定の失敗の場合はfalseを返します。 – Aaron

+1

@Aaron:正確には、istreamを返す。これは!is.fail()の値であるbool(whew!)に変換可能なvoid *に変換可能である。そのため、 'std :: cin >> lastName >> firstName;'が動作します。 –

関連する問題