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

    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分

    文字列を分解する

    1行の中に2つの情報が入っている

    成績管理では、データを Tanaka,85 のような形で1行にまとめて持つことがよくあります。CSVと呼ばれる形式です。読み込んだ側から見ると、これは名前と点数がカンマで一緒くたになった1本の文字列にすぎません。使うには分解する必要があります。

    行を読む

    1行まるごと読むには fgets を使います。

    c

    char line[128];
    while (fgets(line, 128, stdin) != NULL) {
        ...
    }

    fgets は「最大 128 バイトまで」と器の広さを引数で受け取ります。前回やった考え方がそのまま標準関数にも入っています。読むものが無くなると NULL を返すので、それが繰り返しの終わりになります。

    注意点が1つあります。fgets は 改行文字も一緒に読み込みます。"Tanaka,85\n" という中身になるので、そのままだと点数の後ろに改行がぶら下がります。先に消しておきます。

    c

    int i = 0;
    while (line[i] != '\0' && line[i] != '\n' && line[i] != '\r') {
        i++;
    }
    line[i] = '\0';

    改行の場所に '\0' を置くと、そこが文字列の終わりになります。バイトを削っているわけではなく、終わりの印を前へ動かしているだけです。'\r' も見ているのは、Windowsで作られたファイルの行末が2文字だからです。

    区切りで切る

    分解も同じ発想でできます。カンマを探して、そこへ '\0' を置きます。

    c

    int pos = 0;
    while (line[pos] != ',' && line[pos] != '\0') {
        pos++;
    }
    line[pos] = '\0';

    これで line は先頭から見ると "Tanaka" という文字列になり、&line[pos + 1] から見ると "85" という文字列になります。1本の配列の中に、終端を1つ増やしただけで2つの文字列が生まれました。コピーは1回も起きていません。

    このやり方には代償があります。元の行は壊れます。カンマは '\0' に置き換わってしまったので、あとから「元の1行」を出したくなっても戻せません。標準の strtok も内部で同じことをしていて、渡した文字列を書き換えます。文字列リテラルを strtok に渡すと落ちるのはこれが理由です。

    数字の側は atoi で整数に直します。stdlib.h が要ります。

    c

    int score = atoi(&line[pos + 1]);

    では、名前,点数 の行を何行でも受け取って、分解しながら合計を出すプログラムを書いてみましょう。

    要件

    1. fgets で1行ずつ読み、行末の改行を取り除く
    2. カンマの位置にヌル文字を置いて、名前と点数に分ける
    3. 点数は atoi で整数に直す
    4. 各行を Tanaka 85点 の形で表示する
    5. 最後に 合計245点 の形で表示する

    ヒント

    fgets は改行も読み込むので、'\n' と '\r' を探して '\0' に置き換えます

    カンマを '\0' に置き換えると、その手前までが名前の文字列になります

    点数の文字列の先頭は &line[pos + 1] です

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

    関連レッスン

    • 動的な文字列

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

    • つくる 名前入力の安全化

      入力処理を、あふれない形に全面的に書き直せるようになります。

    • 第3章クイズ

      文字列の内部構造と安全な扱い方の理解を確認します。

    • 構造体ポインタと->

      アロー演算子でメンバを読み書きできるようになります。

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

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

    • 引数位置引数=順番で渡す。
    • 関数処理に名前を付けて再利用できる単位
    • 配列サイズ固定の同型データの集まり
    main.c
    エディタを読み込んでいます

    メモ

    文字列を分解する

    ⌘S で保存