[C言語]文字列長取得関数(strlen)を自作

C言語の学習をする上で標準関数を自作することはとても勉強になります。

この記事では文字列長取得関数(strlen)を自作する方法について解説します。

文字列長取得関数の仕様

標準関数の文字列長取得関数は、引数に渡した文字列の文字列長を返します。

C
int len = strlen("hogehoge");

引数に渡した文字列のNULLの位置を返しているだけなので、NULL終端となっていない場合(文字配列内にNULLが存在しない場合)動作未定義となります。

文字列長取得関数を自作

文字列長取得関数は渡された文字列のNULLの位置を返しているだけということがわかりましたので、単純にループしてNULLの位置を返すようにしてみます。

C
// 自作文字列長取得関数
size_t my_strlen(char* s)
{
    // 文字列長
    size_t len = 0;
    // NULLが見つかるまでループ(文字列長インクリメント)
    for(; s[len] != NULL; len++);
    // NULLが見つかった際のlenを返す
    return len;
}

取り立てて説明するまでもありませんが、引数の文字列を先頭から順番に走査してNULLが見つかった位置のインデックスを返しています。

もう少しセキュリティを強化する場合には、引数に最大文字列長を追加します。

C
// 自作文字列長取得関数
size_t my_strlen(char* s, size_t max)
{
    // 文字列長
    size_t len = 0;
    // NULLが見つかるか最大文字列長に到達するまでループ(文字数インクリメント)
    for(; s[len] != NULL && len < max; len++);
    // NULLが見つかったまたは最大文字列長に到達した際のlenを返す
    return len;
}

セキュリティ強化版では、ループの終了条件にインデックスが最大文字列長に到達したかという条件を追加しました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です