C++のgetline()で空白行を含む入力を正しく処理する方法
C++では、getline()関数を使用してストリームから行単位で文字列を読み取ります。この関数は、Enterキーが押されるまで、あるいはユーザーが指定した区切り文字が現れるまで入力を受け付けます。本記事では、getline()関数を使って改行文字や空白行をどのように扱うのか、具体的な実装例とともにわかりやすく解説します。
getline()関数の基本動作
getline()は、<iostream>ヘッダーで提供されている関数です。第1引数に入力ストリーム(通常はcin)、第2引数に読み込んだ文字列を格納するstring型の変数を指定します。標準的な使い方では、1回の呼び出しにつき1行分の入力を読み取り、末尾の改行文字は自動的に破棄されます。
空白行が含まれる入力への対処法
入力データに空白行が含まれている場合、getline()はそのまま空の文字列を返してしまいます。これを防ぐには、読み取った文字列の長さが0であるかどうかを判定し、空であれば再度getline()を呼び出して次の行を読み込むようにします。以下のサンプルコードでは、内側のwhileループによって空白行を自動的にスキップしています。
サンプルコード
#include<iostream>
using namespace std;
int main() {
string str;
int term = 4;
while (term--) {
getline(cin, str);
while (str.length()==0 )
getline(cin, str);
cout << str << " : New Line" << endl;
}
}
実行結果
Hello Hello : New Line World World : New Line This is This is : New Line C++ Language C++ Language : New Line
コードの解説
このプログラムの動作を順番に見ていきましょう。
- 変数
termを4に設定し、外側のwhileループで合計4回の入力処理を行います。 getline(cin, str)によって、標準入力から1行分の文字列を読み取ります。- 読み取った文字列が空(長さが0)の場合、内側のwhileループが再度
getline()を呼び出し、空白行をスキップして次の有効な行を取得します。 - 最終的に得られた非空の文字列を、「New Line」というラベルを付けて出力します。
このように、文字列の長さをチェックする条件をひとつ追加するだけで、入力に空白行が混在していても、意図した通りに有効な行だけを確実に処理できるようになります。ユーザーからの自由形式の入力を受け付けるプログラムや、整形されていないテキストファイルを読み込む場面で特に役立つテクニックです。
-
C++とOpenCVを使って線を描画する方法
OpenCVで線を描画するには、始点と終点の2つの座標が必要です。さらに、線を描くためのキャンバス(描画領域)も用意しなければなりません。線を描画するために必要な要素OpenCVでは、キャンバスとして機能するのが行列(Mat)です。この行列に対して、線の始点と終点を定義し、加えて以下の情報も指定します。線の色線の太さつまり、OpenCVで線を描くには、行列・2つの点・色・線の太さという4つの要素を宣言しておく必要があります。必要なヘッダーファイルOpenCVで線を描画するには、<imgproc.hpp>ヘッダーをインクルードします。これは、line()関数がこのヘッダー内で定義され
-
機内でノートPCが使えないときも安心!フライト中の生産性を保つ4つの方法
金属の筒の中で空を駆け抜ける——それは人類の驚くべき技術的偉業です。しかし実際には、航空旅行を好む人はそれほど多くありません。長い待ち時間、煩わしい保安検査、窮屈な座席、そしてまずい機内食。こうした要素が、空の旅の新鮮さをすっかり奪ってしまいました。とはいえ、飛行機移動にはひとつ明るい面があります。それは、外部からの邪魔が少なく、仕事に集中できることです。 ビジネスパーソンの常連搭乗客たちは、古くから飛行機を「空のオフィス」と呼んできました。ところが近年、高度1万メートルでの生産性は大きな打撃を受けています。スマートフォンより大きい電子機器の機内持ち込み禁止が議論される中、フライト中に仕事