【C言語】
strchrとstrrchrの基本的な使い方
~左から検索と右から検索~

■この記事の概要

この記事では、C言語のstrchr関数の使用時に戻り値のNULLチェックを省略すると、異常終了(セグメンテーションフォルト)が発生するリスクを解説しています。特にCSV形式の文字列処理を例に、入力データが期待通りでない場合に備えた安全なコーディング手法を具体的に示しています。右から検索するstrrchrについても触れています。


■strchrを使って左から検索

#include <stdio.h>
#include <string.h>
int main(void){//左から検索
    char csv[] = "Jugemu,Jugemu,Goko,no,Surikire" ;

    puts(csv);
    for(char *p = strchr(csv, ','); p != NULL;p = strchr(p+1,',')){
        puts(p);
    }
}
./a.out 
Jugemu,Jugemu,Goko,no,Surikire
,Jugemu,Goko,no,Surikire
,Goko,no,Surikire
,no,Surikire
,Surikire

CSV形式(Comma Separated Values)の文字列の中から
カンマ”,”をstrchrで左から検索するサンプルコードです。


■strrchrを使って右から検索

#include <stdio.h>
#include <string.h>
int main(void){ //右から検索
    char csv[] = "Jugemu,Jugemu,Goko,no,Surikire" ;
    puts(csv);
    for(char *p = strrchr(csv, ','); p != NULL;p = strrchr(csv,',')){
        puts(p);
        *p = '\0';//検索済みを元データから削除
    }
}
./a.out 
Jugemu,Jugemu,Goko,no,Surikire
,Surikire
,no
,Goko
,Jugemu

CSV形式(Comma Separated Values)の文字列の中から
カンマ”,”をstrrchrでから検索するサンプルコードです。


■戻り値をNULLチェックしないとSegmentation faultする

#include <stdio.h>
#include <string.h>
int main(void){//返却値のNULLチェックしないで異常終了する例
    char csv[] = "Jugemu,Jugemu,Goko,no,Surikire" ;
    puts(csv);

    char *p = NULL;
    p = strchr(csv,',');    puts(p);
    p = strchr(p+1,',');    puts(p);
    p = strchr(p+1,',');    puts(p);
    p = strchr(p+1,',');    puts(p);
    p = strchr(p+1,',');    puts(p);
}
./a.out 
Jugemu,Jugemu,Goko,no,Surikire
,Jugemu,Goko,no,Surikire
,Goko,no,Surikire
,no,Surikire
,Surikire
Segmentation fault (コアダンプ)

実務では必ずNULLチェックをしましょう。
対象が csv 形式で必ずカンマがあるはずでも
異常な入力に備えましょう。

筆者の環境下では異常終了しました。

参考:

ERR33-C. 標準ライブラリ関数のエラーを検出し対処する