【第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;
}
出力
サンプル説明
このサンプルは
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章:データ型・演算子・式に記述されています。
定数の説明のところです。