std::getline


istream& getline(istream& is, string &str, char delim);
  • std::getline関数は、パラメータとしてdelimが現れるまで入力を受け入れます.
  • delimを含む入力を受信
  • 、すなわちstd::getline関数が呼び出された後、入力バッファにdelimは存在しません.
  • cinを介して入力を受信する場合、delimが「n」でない場合、注意が必要です.
  • 入力を受信すると、最後に「n」が一緒に送信されるため、受信前にdelimに遭遇して読み取りを行うと、入力バッファはその後の文字列を保持する.
  • この状態(delimパラメータなし)でstd::getlineを再実行し、新しい入力を受信するまで既存のバッファ内の入力文字列しか受信できません.
  • int main() {
    	std::string str, tmp;
      
      str = "";
    	std::getline(std::cin, tmp, ';');
      str += tmp;
      std::getline(std::cin, tmp);
      str += tmp;
      std::cout << "string value :" << str << std::endl;
      return 0;
    }
  • 上記コードを実行する場合、最初の入力値は「hello;」であり、入力値が「world」の場合、予想値は「hello world」ですが、実際の実行時の結果値は「hello」です.
  • "hello;"入力時に入力「n」の値は入力バッファ
  • に入る.
  • 以降2番目のgetlineを実行し、1番目の文字を読み出し、デフォルトdelim値は「n」であるため、
  • の読み出しを停止する.
    このような状況を防止するためには、std::getline関数を呼び出した後、入力バッファを空にする操作を実行する必要があります.
  • cin.ignore()関数で入力バッファをクリアできます.
  • 例えば、
  • 、cin.ignore(5,'\n'); この操作を行うと、入力バッファから5文字または「n」文字が読み出されるまで、入力バッファが空になります.
  • パラメータがない場合は、入力バッファの最初の文字のみが空になります.
  • int main() {
    	std::string str, tmp;
      
      str = "";
    	std::getline(std::cin, tmp, ';');
      str += tmp;
      cin.ignore(128, '\n');
      std::getline(std::cin, tmp);
      str += tmp;
      std::cout << "string value :" << str << std::endl;
      return 0;
    }
  • 以上のコードは、所望の結果値「hello world」
  • を出力することを保証する.
  • 参照cinを使用して文字を入力すると、それを開行文字の前に読み込む.
  • 、すなわちcinを介して入力を受信と、下り文字は入力バッファに保持され、
  • .