質問

私は C++ の学習を練習するための個人的な使用と、その機能として MLA 引用ジェネレーターを作成する小さなプログラムを作成しています (数十の引用を含む大きな論文を書いています)。

それを行うためのより良い方法がないため(私はクラスやメイン内での他の.cppファイルの使用を理解していないので、わざわざ言わないでください、もっと時間があるときにそれに取り組みます)、私は次のように書いています引用の種類ごとに機能。もっと時間があれば、これを再利用コードごとに関数に分割するかもしれません。

私の質問は次のとおりです。std::cin オブジェクトはどのように機能しますか?現在、単一の単語であると予想される文字列については std::cin >> を使用して読み込み、スペースを含む文字列については getline(std::cin, string) を使用しています。ただし、適切な出力が得られません。私は std::cin がどのように動作するのか、そしてなぜ一部の入力を予期せずスキップし続けるのか (たとえば、webPage に入力する機会を与えずに webPage をスキップする) を知りたいだけです。

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
}

編集: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. 

ご覧のとおり、入力がスキップされているため、何か問題が発生しています。

役に立ちましたか?

解決

ここで何が起こっているのかというと、 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ヒットsgetline() の呼び出しが問題を解決する前に、pace) を実行します。

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

ただし、引数内で実行すると、どこを見逃したかが簡単にわかります。

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

他のヒント

を使用するときは、 >> オペレーター、 cin 次の空白文字まで読み取りますが、空白文字は処理しません。それで、あなたが持っているとき

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

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

代わりに、使用する予定がある場合は、 getlineoperator >>, 、電話することができます std::cin.ignore() 電話をかける前に改行を入れる getline.

編集:実行すると期待どおりに機能します

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

2 番目の呼び出しでは先頭の空白がすべて無視されるためです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top