【第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章:データ型・演算子・式に記述されています。
インクリメントとデクリメント演算子の説明のところです。