■この記事の概要
この記事では、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 形式で必ずカンマがあるはずでも
異常な入力に備えましょう。
筆者の環境下では異常終了しました。
参考: