C++で文字列の最後の10行を出力するプログラム
はじめに
本記事では、C++を使って文字列の最後の10行を出力する方法について詳しく解説します。
ここでは、改行文字(\n)で区切られた複数行の文字列が与えられるものとします。このとき、文字列の末尾から数えて10行分の内容だけを取り出して出力するのが今回の目的です。
想定される場面
たとえば、ログファイルや長いテキストデータの「末尾の一部だけ」を表示したい場合など、この処理は実際の開発でもよく使われます。Linuxのtailコマンドのような動作を自前で実装するイメージです。
アルゴリズムの考え方
この問題は、以下の手順で解決できます。
strrchr()関数を使って、文字列内で最後に現れた改行文字の位置を見つけます。- その位置から先頭方向へ向かって移動しながら、改行文字が出現するたびに行数をカウントします。
- 10行分(または文字列の全行数)に達したら、そこを出力開始位置とします。
このアプローチなら、文字列全体を分割して配列に格納する必要がないため、メモリ効率も良好です。
サンプルコード
#include <bits/stdc++.h>
using namespace std;
#define DELIM '\n'
// 最後のn行を出力する関数
void print_last_lines(char *str, int n){
if (n <= 0)
return;
size_t cnt = 0; // 検出した行数を保持
char *target_pos = NULL;
// 最終行の開始位置を検索
target_pos = strrchr(str, DELIM);
if (target_pos == NULL){
cout << "与えられた文字列は1行のみです";
return;
}
// 改行を数えながら先頭方向へ移動
while (cnt < n){
// 直前の改行位置まで戻る
while (str < target_pos && *target_pos != DELIM)
--target_pos;
if (*target_pos == DELIM)
--target_pos, ++cnt;
else
break; // 文字列がn行未満の場合は終了
}
// 開始位置を行の先頭へ調整
if (str < target_pos)
target_pos += 2;
cout << target_pos << endl;
}
int main(void){
char *str1 = "str1\nstr2\nstr3\nstr4\nstr5\nstr6\nstr7\nstr8\nstr9"
"\nstr10\nstr11\nstr12\nstr13\nstr14\nstr15\nstr16\nstr17"
"\nstr18\nstr19\nstr20\nstr21\nstr22\nstr23\nstr24\nstr25";
print_last_lines(str1, 10);
return 0;
}実行結果
str16 str17 str18 str19 str20 str21 str22 str23 str24 str25
コードのポイント
strrchr():指定した文字(ここでは改行'\n')が最後に出現する位置へのポインタを返す標準ライブラリ関数です。これにより、まず末尾の行を特定します。- エラー処理:改行文字が見つからない場合、その文字列は1行しかないため、専用のメッセージを表示して処理を終了します。
- 行数不足への対応:文字列全体が10行に満たない場合は、途中でループを抜けるため、存在するすべての行が出力されます。
- ポインタ調整:
target_pos += 2;によって、改行文字自体をスキップし、行の先頭から出力できるようにしています。
計算量について
このアルゴリズムは、文字列の末尾から必要な行数ぶんだけ遡るため、時間計算量は O(k)(kは出力対象となる部分の文字数)となります。文字列全体を走査するわけではないので、非常に長いテキストでも高速に動作します。
-
C++で2本の直線の交点を求めるプログラムの書き方
直線ABを定義する2点A・Bと、直線CDを定義する2点C・Dが与えられたとき、この2つの直線の交点を求めるのが課題です。 注意 − すべての点は、X座標とY座標を持つ2次元平面上にあるものとします。 図では、A(a1, a2)とB(b1, b2)を通る直線、C(c1, c2)とD(d1, d2)を通る直線という、互いに異なる2つの直線が描かれており、P(p1, p2)がその交点を表しています。 交点の求め方 まず、2点を通る直線を「ax + by = c」の形の方程式で表します。各点の座標を使って、次のように係数を計算します。 A1 = b2 - a2 B1 = a1 - b1 C1 =
-
ユーザーが入力した数値を出力するC++プログラム
C++では、入力と出力のためにそれぞれ「cin」と「cout」というオブジェクトを使用します。cinはistreamクラスのインスタンスであり、キーボードなどの標準入力デバイスに接続されています。一方、coutはostreamクラスのインスタンスであり、ディスプレイ画面などの標準出力デバイスに接続されています。 ユーザーが入力した数値を表示するプログラムは、以下のとおりです。 サンプルコード #include <iostream> using namespace std; int main() { int num; cout<<Enter the num