C++サンプル集

【第1部】C言語(K&R検証)編

0014.文字列を連結する

ソース紹介

CPPファイルに記述
#include <iostream>
#include <cstdio>
using namespace std;

/*
tをsの終わりに連結する
sは十分に大きくなければならない
*/
void strcat(char s[], char t[]) {
    int i{}, j{};
    while (s[i] != '\0') {
        i++;
    }
    while ((s[i++] = t[j++]) != '\0') {
        ;
    }
}

//sに行を入れ、長さを返す
//修正版(改行は除く)
int getline2(char s[], int lim) {
    char c;
    int i{};
    while (--lim > 0 && (c = cin.get()) != EOF && c != '\n') {
        s[i++] = c;
    }
    s[i] = '\0';
    return i;
}

#define MAXLINE 1000
char line[MAXLINE];
char addline[MAXLINE];

/*
strcatをテストする
*/
int main()
{
    int len;
    while ((len = getline2(line, MAXLINE)) > 0) {
        //連結
        strcat(addline, line);
        cout << addline << endl;
    }
    return 0;
}
出力
abcde
abcde
1234
abcde1234
ABCD
abcde1234ABCD
xyz
abcde1234ABCDxyz
^Z

サンプル説明

 getline2が出力するキーボードのエコーの部分もあるので、ちょっとわかりにくいですが、2,4,6,8行目が連結した結果の出力です。
 abcde、1234、ABCD、xyzが連結されていくさまがわかると思います。
 また、このstrcat()関数は連結される文字列char s[]が十分に大きい配列でなくてまなりません。
 現時点で、MAXLINEの大きさを持ってますが、実際にアプリケーション内などで使用する場合は、最大文字数などのパラメータも必要でしょう。
 stringを使うと以下のようにかなりシンプルに書けます。

ソース紹介

CPPファイルに記述
#include <iostream>
#include <string>
using namespace std;

/*
文字列の連結
*/
int main()
{
    string str;
    string allstr;
    while (getline(cin, str)) {
        allstr += str;
        cout << allstr << endl;
    }
    return 0;
}
 stringを使うと、strcat()関数は、もう必要がなくなります。
 またC++のgetline()関数改行を含めないので、連結も楽です。stringに入力できる最大の文字数は、以下のように調べられます。

ソース紹介

CPPファイルに記述
#include <iostream>
#include <string>
using namespace std;

int main()
{
    string str;
    cout << "最大文字数: " << str.max_size() << endl;
    return 0;
}
 ちなみに、僕の環境では
出力
最大文字数: 9223372036854775807
 とでます。結構膨大な量ですね。

K&Rでの記述

 元になったのは第2章:データ型・演算子・式に記述されています。インクリメントとデクリメント演算子の説明のところです。