C++で文字列の末尾N行を出力するプログラムを解説
はじめに
このチュートリアルでは、C++を使って文字列の末尾(最後)のN行を出力するプログラムについて解説します。
ここでは、改行文字(\n)で各行の始まりを示す複数行の文字列と、末尾から出力したい行数Nが与えられます。私たちのタスクは、文字列の終わりから数えてN行分をすべて出力することです。
アルゴリズムのポイント
この問題を効率的に解くためには、以下の手順が有効です。
1. strrchr関数を使って、文字列内で最後に出現する改行文字の位置を見つけます。
2. その位置から前方に向かって走査し、改行文字を見つけるたびに行数をカウントします。
3. 必要な行数Nに達した時点で、その位置以降の文字列を出力します。
この方法なら、文字列全体を最初から順番に処理する必要がなく、末尾から必要な部分だけを素早く特定できます。
サンプルコード
#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 << "Given string is a single line string";
return;
}
// 対象となる先頭行の開始位置まで移動
while (cnt < n){
// 前の行へ移動
while (str < target_pos && *target_pos != DELIM)
--target_pos;
if (*target_pos == DELIM)
--target_pos, ++cnt;
// 文字列の行数がN行未満の場合は終了
else
break;
}
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, 14);
return 0;
}コードの解説
まず、n が 0 以下の場合は何も出力せずに関数を終了させます。次に、strrchr(str, DELIM) によって文字列中で最後の改行文字の位置を取得します。もし改行文字が見つからなければ、その文字列は1行のみであることを意味するため、その旨を表示して終了します。
その後、while ループでポインタを前方に移動させながら改行文字を数えていき、N行分さかのぼった位置を特定します。文字列全体の行数がN行に満たない場合はループを抜けて、存在するすべての行を出力します。
実行結果
上記のプログラムでは、25行ある文字列から末尾の14行を出力しています。
str12 str13 str14 str15 str16 str17 str18 str19 str20 str21 str22 str23 str24 str25
まとめ
このように、strrchr を活用して末尾から走査することで、大きな文字列データからも効率的に最後のN行だけを取り出すことができます。ログファイルの末尾表示など、実際のアプリケーションでも応用できるテクニックなので、ぜひ覚えておきましょう。
-
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