C++サンプル集

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

0009.文字列の長さを調べる

ソース紹介

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

/*
strlen: sの長さを返す
*/
int strlen(char s[]) {
    int i{};
    while (s[i] != '\0') {
        ++i;
    }
    return i;
}

/*
文字列の長さを調べる
*/
int main()
{
    char str1[] = "hello";
    char str2[] = "abcdefgh";

    cout << str1 << "は" << strlen(str1) << "文字" << endl;
    cout << str2 << "は" << strlen(str2) << "文字" << endl;

    return 0;
}
出力
helloは5文字
abcdefghは8文字

サンプル説明

 このサンプルはC言語の標準ライブラリにも含まれるstrlen()関数を説明したものですC/C++では文字列の終端'\0'つまり 0 という値が入ってます(ほかの言語では必ずしもそうではありません)。この特性を利用して、文字列の長さを検証します。
 しかし現在では、strlen()関数は、引数が1つではなく2つのバージョン
size_t strnlen(const char *str,size_t numberOfElements);  
 を使うことが奨励されています。つまり永遠に'\0'が来なかったらどうなるかということです。いずれどこかで破たんしてスタックオーバーフローを起こす可能性があります。スタックオーバーフローは処理系によっては思わぬセキュリティ的な穴が生じます。ハッキングの温床にもなりかねませんので、もしC言語のstrnlen()を使う場合は、セキュリティ強化バージョンを使用しましょう。
 さて、この処理をstringを使って書くと、以下のようになります。

ソース紹介

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

/*
文字列の長さを調べるテスト
*/
int main()
{
    string str1= "hello";
    string str2 = "abcdefgh";

    cout << str1 << "は" << str1.size() << "文字" << endl;
    cout << str2 << "は" << str2.size() << "文字" << endl;

    return 0;
}
 stringを使うと、もうstrnlen()関数は必要ありません。大きすぎる文字列があっても、stringは内部でメモリを取得します。
 もしメモリを取得できなかったら、string例外を発生させます。つまり内部でエラー処理が行われます。
 このように便利なstringですが、この便利だということがわかるのはstrnlen()関数があってこそのことです。
 ですからstrnlen()関数を一度書いてみるというのは重要なことです。

K&Rでの記述

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