C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

std ::getline()がフォーマットされた抽出後に入力をスキップするのはなぜですか?


std ::getline()は、フォーマットされた抽出の後に入力をスキップします。このエラーは、次のコードから簡単に確認できます-

サンプルコード

#include <iostream>
#include <string>
using namespace std;

int main(){
   string name;
   string city;

   if (cin >> name && getline(cin, city)){
      cout << "Your name " << name << " and city " << city;
   }
}

出力

Amal
Your name Amal and city

プログラムが2番目の入力を受け取らないことがわかります。 2番目の入力が必要な場合もありますが、出力には最初の入力のみが表示されます。さて、問題はなぜそれがこのように振る舞うのかということです。

この問題の主な理由は、最初の文字列を書き込んでいるときに、EnterボタンまたはReturnボタンを押していることです。 EnterキーまたはReturnキーを押すと、現在の行の後に「\n」文字が挿入されます。このキャラクターが問題を引き起こしています。文字列の次の部分を無視しています。

名前が「Amal」の場合、内部的には「Amal\n」になります。この問題を克服するための1つのオプションは、最初の抽出後にstd ::cin.ignore()を呼び出すことです。次に、次に使用可能な文字を破棄するため、正常に機能します。


  1. C ++で「名前空間stdを使用する」とはどういう意味ですか?

    同じクラスに同じ名前の2人のPiyushがいる場合を考えてみましょう。それらを明確に区別する必要があるときはいつでも、名前とともにいくつかの追加情報を使用する必要があります。たとえば、地域、別の地域に住んでいる場合、母親や父親の名前などです。 同じ状況がC++アプリケーションでも発生する可能性があります。たとえば、xyz()という関数を持つコードを記述していて、同じ関数xyz()を持つ別のライブラリが利用可能であるとします。これで、コンパイラーは、コード内で参照しているxyz()関数のバージョンを知る方法がありません。 名前空間は、この問題を克服するように設計されており、異なるライブラリで

  2. 0が渡された場合にphpのin_arrayがtrueを返すのはなぜですか?

    in_arrayがTrueを返す理由は、文字列から数値への変換である可能性があります。文字列が関数に渡されると、検索する必要のある値である0が返されます。 PHPはルーズジャグリングを使用します。つまり、要素を比較するときに===の代わりに==を使用します。したがって、タイプではなく、それらの値が比較されます。 もう1つの理由は、型ジャグリングです。これは、変数型がコードのコンテキストで処理されることを意味します。 たとえば、float値が変数に割り当てられると、それは浮動小数点値になります。文字列が整数にキャストされたときのように動作します この種の動作を回避するために、3番目のパラ