std :: cin input with space?


144
#include <string>

std::string input;
std::cin >> input;

ユーザーが「Hello World」と入力したいと考えています。しかしcin、2つの単語の間のスペースで失敗します。cin全体をどのように取り込むことができHello Worldますか?

私は実際に構造体でこれを行っており、cin.getline動作していないようです。これが私のコードです:

struct cd
{
    std::string CDTitle[50];
    std::string Artist[50];
    int number_of_songs[50];
};

std::cin.getline(library.number_of_songs[libNumber], 250);

これはエラーになります。何か案は?


27
そのような新しい質問をするために質問を編集するべきではありません。その理由は、人々があなたの元の質問にすでに答えを出しており、今ではそれらの答えが文脈から外れているように見えるからです。元の質問にすでに回答している場合は、混乱を避けるために新しい質問を開始してください。
ピート

少し調べてみるlibraryと明らかですが、変数の型であることを明確にするために変数の宣言を追加してくださいcd
chandsie

すみません、これは急いで行われました。これを再投稿します。
レモン

1
代わりに再投稿する場合は、modによる削除の質問にフラグを付けてください。
オービットの軽量レース、2011

2
アップデートでは、にしようとしgetlineていintます。もちろんそれは失敗します。
Ben Voigt

回答:


102

使用する必要がありますcin.getline()

char input[100];
cin.getline(input,sizeof(input));

7
@Kevin Meh、それは起こります。C ++は、思ったほど直感的ではありません。
ピート

61
えー char-buffersを使用する理由 それは2011
。–軌道の軽さのレース'30

3
そして、なぜ使用しないのcin.getline(input, sizeof(input));ですか?また、返品状況を確認してはいけませんか?
ジョナサンレフラー2013年

2
@JonathanLefflerこれが書かれた時点で、これは私が最初に尋ねられた質問に対する答えでした(実際の質問の最初のコメントを見ると、OPによる編集のためにコンテキストが変更されていることがわかります)。どちらにしても、答えがひどいと感じた場合は、反対票を投じてください。これは「最良の」解決策ではないかもしれませんが、それはそれ以上の解決策ではないことを認めます。なぜ私が何かを使用しなかったのかを尋ねる代わりに、あなたが私たちがあなたのやり方でやるべき理由をすべて教えてくれるでしょう。
2013年

7
あなたの答えはひどくなく、反対投票する必要はありません。2つの小さな変更で改善されると思います。変更1はsizeof(input)、の呼び出しで100の代わりに使用しcin.getline()ます。つまり、入力バッファのサイズを変更でき、2行ではなく1行のみを変更する必要があります。変更2はcin.getline()、たとえばif (!cin.getline(input, sizeof(input))) { ...handle EOF or error... }入力操作が特に予期しない動作に対して脆弱であることをOPに思い出させるために、または類似のものを使用して、からの戻りをテストすることです。他の答えもこれを必要とします。
ジョナサンレフラー2013年

215

「失敗」することはありません。読むのをやめるだけです。字句トークンは「文字列」と見なされます。

使用する std::getline

int main()
{
   std::string name, title;

   std::cout << "Enter your name: ";
   std::getline(std::cin, name);

   std::cout << "Enter your favourite movie: ";
   std::getline(std::cin, title);

   std::cout << name << "'s favourite movie is " << title;
}

これは同じではないことに注意してくださいstd::istream::getline Cスタイルで動作する、charバッファではなく、std::stringS。

更新

編集した質問は、元の質問とほとんど似ていません。

文字列や文字バッファではなくに書き込もうとしていgetlineましたint。ストリームのフォーマット操作は、operator<<およびでのみ機能しoperator>>ます。それらの1つを使用する(および複数の単語の入力に応じて微調整する)か、使用getlineして字句的にint事後的に変換します。


2
文字の長さを指定する必要がないため、この回答は承認された回答よりもはるかに優れています。
TheWanderer 2018

1
@TheWanderer確かに、それは大きなメリットです。
オービットのライトネスレース

sstreamを含めることを忘れないでください:#include <sstream>
GilbertS

@LightnessRacesinOrbit、助けてもらえますか?これにより、出力を印刷する際に理由もなく余分な改行ができます。
Anshuman Kumar

@AnshumanKumar getline返される文字列に終端の改行を含めることができると思います。もしそうなら、それを削除するのはあなた次第です。
Mark Ransom

31

標準ライブラリはと呼ばれる入力関数を提供wsし、入力ストリームから空白を消費します。次のように使用できます。

std::string s;
std::getline(std::cin >> std::ws, s);

4
これが今のところ最良の答えだと思います。これを上記のstd :: cin >>と組み合わせることができます。
アンドラ

1
これまでのベストアンサー。/ ループstd::getline(std::cin, s)で入力を待機しているときに入力を中断すると、使用が非常に煩雑になり、入力が中断されます。このオプションで問題が解決しました!whilefor
オメロヴィッツ

インクルードsstream:#include <sstream>
GilbertS

24

使用する :

getline(cin, input);

関数は次の場所にあります

#include <string>

2
+1これが実際に私のために働いた唯一の答えです。残りの回答はcin.getline()を使用するように言っていますが、関数が存在しないというエラーが表示されました。
ブレンボ

7
@blembo:本当に?私の回答は、この回答より3年以上前に投稿されたため、まったく同じことを言っています(あなたが言っているのとは対照的です)。
オービットの軽量レース、

@blembo:そして、もしcin.getlineあなたのシステムに存在しなければ、あなたは何か非常に悪いことをしました。ほとんどの場合、間違った引数を渡していました。あなたの過ちを他人のせいにしないことをお勧めします...
オービットでのライトネスレース

13

cinで.getline関数を使用したい。

#include <iostream>
using namespace std;

int main () {
  char name[256], title[256];

  cout << "Enter your name: ";
  cin.getline (name,256);

  cout << "Enter your favourite movie: ";
  cin.getline (title,256);

  cout << name << "'s favourite movie is " << title;

  return 0;
}

ここから例を取りました。詳細と例については、こちらをご覧ください。


12
実際、member-を使用することはめったにありませんgetline。それは時代遅れです。getline代わりにfree を使用してくださいstd::string。[ところで、cplusplus.comは推奨リソースではありません ]
オービットの

1
@Tomalak cplusplus.comが推奨されないのはなぜですか?私はいつもそれを使用しています:P
レモン

6
@KevinDuke:チュートリアルは誤解を招きやすく不正確な場合があり、リファレンスには多数のエラーが含まれています。これらは優れたリソースです。
オービットの軽さのレース2011年

1
@NickSweeting:うん。代わりにこれを使用してください
オービットでの軽さのレース

1
ドキュメントリンクの場合、cppreference.comはcplusplus.comの効果的な代替品です(どちらも非公式の言い換えです)
Ben Voigt

4

ザCウェイ

getscstdio(cのstdio.h)にある関数を使用できます。

#include<cstdio>
int main(){

char name[256];
gets(name); // for input
puts(name);// for printing 
}

C ++の方法

gets c ++ 11で削除されました。

[推奨]: またはcin.getline(name、256)にあるgetline(cin、name)を使用できますstring.hであるiostream自分自身。

#include<iostream>
#include<string>
using namespace std;
int main(){

char name1[256];
string name2;
cin.getline(name1,256); // for input
getline(cin,name2); // for input
cout<<name1<<"\n"<<name2;// for printing
}

10
非常に悪いアドバイス、gets安全に使用することは不可能です。C11では完全に削除されています。
マット

1

入力を取得するには、次のメソッドを使用します。

#include <iostream>
#include <string>

using namespace std;

int main(void) {
    string name;

    cout << "Hello, Input your name please: ";
    getline(cin, name);

    return 0;
}

スペース文字を含む文字列の配列の全長を定義するのではなく、実際には非常に使いやすいです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.