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

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行だけを取り出すことができます。ログファイルの末尾表示など、実際のアプリケーションでも応用できるテクニックなので、ぜひ覚えておきましょう。

  1. 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 =

  2. ユーザーが入力した数値を出力するC++プログラム

    C++では、入力と出力のためにそれぞれ「cin」と「cout」というオブジェクトを使用します。cinはistreamクラスのインスタンスであり、キーボードなどの標準入力デバイスに接続されています。一方、coutはostreamクラスのインスタンスであり、ディスプレイ画面などの標準出力デバイスに接続されています。 ユーザーが入力した数値を表示するプログラムは、以下のとおりです。 サンプルコード #include <iostream> using namespace std; int main() { int num; cout<<Enter the num