[解決済み] C++のstd::cinオブジェクトのルールは何ですか?
質問
C++の学習の練習と、その機能としてMLAの引用文作成機能(数十の引用文がある大きな論文を書いています)を個人的に使うために、小さなプログラムを書いています。
私はクラスや他の.cppファイルをmainの中で使用することを理解していないので、わざわざ私に言わないでください。もっと時間があれば、これを再利用されるコードごとの関数に分解するかもしれません。
質問ですが、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'
を入力したとき、その時点では
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);
関連
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] ルール・オブ・スリーとは?
-
[解決済み] コピーアンドスワップ慣用句とは?
-
[解決済み] C++の識別子でアンダースコアを使用する場合のルールについて教えてください。
-
[解決済み] ベースクラスのコンストラクタを呼び出す際のルールは?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++