コース一覧
    C言語中級 文字列・構造体
    strlenを自作する

    C言語中級 文字列・構造体

    C言語の文字列と構造体を学び、複数のデータを整理して扱うコースです。

    1
    文字列処理の実践
    01. strlenを自作する15分
    02. strcpyを自作する15分
    03. バッファオーバーフロー体験15分
    04. 文字列を分解する15分
    05. 動的な文字列15分
    06. つくる 名前入力の安全化15分
    07. 第3章クイズ10分
    2
    構造体とポインタ
    01. 構造体ポインタと->15分
    02. 構造体の動的確保15分
    03. 動的な構造体配列15分
    04. 関数ポインタ15分
    05. qsortで並べ替える15分
    06. つくる 動的Student完成15分
    07. 第4章クイズ10分

    strlenを自作する

    文字列の終わりは誰が決めているか

    第2章では、malloc で確保した領域が「何バイトあるか」を自分で覚えておく必要がありました。ところが文字列だけは事情が違います。char の並びの最後に ヌル文字 '\0' という番人が置かれていて、長さを覚えていなくても終わりが分かるようになっています。

    c

    char name[7] = "Tanaka";

    この配列の中身は 'T' 'a' 'n' 'a' 'k' 'a' '\0' の7バイトです。見えている文字は6つですが、必ず1バイト余分に要ります。要素数を7ではなく6と書くと終端が入らず、文字列として扱った瞬間にどこまでも読み続けてしまいます。

    '\0' は数値としては 0 です。'0'(ゼロという文字、値は48)とは別物なので、比べるときに書き間違えると条件が一生成立しません。

    strlen は数えているだけ

    strlen は長さをどこかに保存しているわけではありません。呼ばれるたびに先頭から '\0' が出るまで1バイトずつ歩いて、歩数を返しています。だから同じ文字列に対して何度も呼べば、そのたびに走査が走ります。

    自分で書くと次のようになります。

    c

    int my_strlen(const char *s) {
        int n = 0;
        while (*s != '\0') {
            n++;
            s++;
        }
        return n;
    }

    第1章でやったポインタの歩き方がそのまま出てきます。s++ で1文字ぶん進み、*s でそこの1バイトを見ています。char は1バイトなので、s++ は素直に隣の番地へ移ります。

    引数に付いている const は「この関数は指す先を書き換えません」という宣言です。呼ぶ側から見ると、渡した文字列が壊されない保証になります。読むだけの引数には付ける習慣を付けておくと、あとで自分を助けます。

    戻り値が '\0' を含まない意味

    my_strlen("Tanaka") は 6 を返します。終端の1バイトは数に入りません。この「見えている文字数」と「必要なバイト数」が1ずれることが、このあとの回でずっと効いてきます。文字列をコピーする器を用意するときは strlen + 1 バイト要る、と体に入れておいてください。

    なお、ここで扱う名前はアルファベットに限ります。日本語の文字は1文字が複数バイトになるので、strlen が返すのは文字数ではなくバイト数になります。この違いは今は脇に置いて、1文字1バイトの世界で仕組みを掴みます。

    では、自作の my_strlen を書いて、純正の strlen と同じ答えになるか確かめてみましょう。

    要件

    1. my_strlen という関数を自分で書く。引数は const char *、戻り値は int
    2. 添字 [] ではなくポインタを進める形で走査する
    3. 1行目に 自作の結果は6です の形で表示する
    4. 2行目に strlenの結果は6です の形で表示する

    ヒント

    終わりの判定は *s != '\0' です。'0' と '\0' は別物なので気をつけてください

    strlen の戻り値は size_t なので、%d で出すなら (int) にキャストします

    scanf("%63s", name) は空白の手前までを読み込みます

    生田 陸人
    監修生田 陸人
    ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
    編集 ゆめさく編集部·公開 2026/08/07

    関連レッスン

    • strcpyを自作する

      文字列コピーの仕組みを自分で書けるようになります。

    • バッファオーバーフロー体験

      あふれがなぜ危険かを説明し、安全な書き方に直せるようになります。

    • 文字列を分解する

      区切り文字で分ける処理を書けるようになります。

    • 動的な文字列

      長さに合わせて必要なぶんだけ確保できるようになります。

    このレッスンに出てくる用語

    意味があいまいなまま進んだ語は、ここから読み直せます。

    • 配列サイズ固定の同型データの集まり
    • 素数1 と自分自身でしか割り切れない自然数
    • 引数位置引数=順番で渡す。
    • 関数処理に名前を付けて再利用できる単位
    • 戻り値呼び出し元への返答を表す点線矢印
    main.c
    エディタを読み込んでいます

    メモ

    strlenを自作する

    ⌘S で保存