次の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;
それで、問題は何ですか?すべてのケースについて誰か説明してください!ありがとうございました。
彼らは異なることをするので、あなたが望むものを行うもの、または以下に示すより良い選択肢を選択してください。
最初の_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
_
文字列は、任意の量の入力に対応するために大きくなります。
問題は、ほとんどの場合、後で値を入力する方法にあります。 Enterキーを押すたびにストリームに入れられる改行文字を「つかむ」ために、すべての初期化後のcin.get()
があります。次のように値の入力を開始するとします。
_2
a b c d...
_
2の後にEnterを押したと仮定すると、改行文字もストリームに置かれました。その後cin.get()
を呼び出すと、改行文字を取得して破棄し、残りのコードが適切に入力を取得できるようにします。
最初の質問に答えるには、配列に対して、オーバーロードされた演算子_cin.get
_の代わりに_>> cin>>
_を使用する必要があります。オーバーフローとデータ破損/プログラムのクラッシュにつながります。
一方、cin.get()
を使用すると、読み込まれる文字の最大数を指定して、このようなバグを防ぐことができます。
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」のみを入力できます。これが最初の質問に答えることを願っています。私は個人的に文字列を使用します。