web-dev-qa-db-ja.com

char配列のcinとcin.get()の違い

次の2つのコードがあります。

char a[256];
cin>>a;
cout<<a;

そして

char a[256];
cin.get(a,256);cin.get();
cout<<a;

おそらく、cin.get()なしの2番目のものと比較して。

char a[256];
cin.get(a,256);
cout<<a;

私の質問は(最初の質問)です:文字配列の場合、何を使うべきですか? cinまたはcin.get()?そして、なぜcin.get()を使用する必要があるのですか? charの初期化後にパラメーターがありませんか?

2番目の質問は、c ++の先生がcin.get()を使用してすべての初期化char配列またはint配列またはint配列の後にcin.get()を使用し、再びcin.get()を使用することを教えてくれたことです。その後。それが最初に聞きたかったことです。

だから、今、私はこれら2を得た:この場合、整数の初期化の後にcin.get()なしで、私のプログラムは壊れて、私はもうcharの初期化を行うことができません。

int n;
cin>>n;
char a[256];
cin.get(a,256); cin.get();  // with or without cin.get();?
cout<<a;

そして正しいもの:

int n;
cin>>n; cin.get();
char a[256];
cin.get(a,256); cin.get(); // again, with or without?
cout<<a;

それで、問題は何ですか?すべてのケースについて誰か説明してください!ありがとうございました。

11
Ruben P

彼らは異なることをするので、あなたが望むものを行うもの、または以下に示すより良い選択肢を選択してください。

最初の_cin>>a;_は、単一のWordを読み取り、先頭のスペース文字をスキップし、スペース文字(行末を含む)に遭遇すると停止します。

2番目のcin.get(a,256);cin.get();は行全体を読み取り、行末文字を消費するため、これを繰り返すと次の行が読み取られます。 cin.getline(a,256)は、これを行うためのわずかに洗練された方法です。

3番目のcin.get(a,256)は行全体を読み取りますが、ストリームに行末文字を残します。これにより、これを繰り返しても入力は行われません。

いずれの場合も、入力Word/lineが固定サイズのバッファーよりも長い場合、何らかの悪影響を及ぼすことがあります。そのため、通常はより使いやすい文字列タイプを使用する必要があります。

_std::string a;
std::cin >> a;              // single Word
std::getline(std::cin, a);  // whole line
_

文字列は、任意の量の入力に対応するために大きくなります。

10
Mike Seymour

問題は、ほとんどの場合、後で値を入力する方法にあります。 Enterキーを押すたびにストリームに入れられる改行文字を「つかむ」ために、すべての初期化後のcin.get()があります。次のように値の入力を開始するとします。

_2 

a b c d...
_

2の後にEnterを押したと仮定すると、改行文字もストリームに置かれました。その後cin.get()を呼び出すと、改行文字を取得して破棄し、残りのコードが適切に入力を取得できるようにします。

最初の質問に答えるには、配列に対して、オーバーロードされた演算子_cin.get_の代わりに_>> cin>>_を使用する必要があります。オーバーフローとデータ破損/プログラムのクラッシュにつながります。

一方、cin.get()を使用すると、読み込まれる文字の最大数を指定して、このようなバグを防ぐことができます。

3
Nazara

Char配列の場合、cin.get()を使用します。これは、空白をカウントするのに対して、cinは、たとえば、読み取る最大文字数を設定しないためです。

 char foo[25]; //set maximum number of characters 
 cout << "Please type in characters for foo << endl;
 cin.get(foo,25);
 cout << ' ' << foo;

この場合、24文字とヌルターミネータ文字「/ 0」のみを入力できます。これが最初の質問に答えることを願っています。私は個人的に文字列を使用します。

2
Michael Davis