【C言語】strchr関数の返り値をチェックする


返り値のNULLチェックを手抜きする

void nocheck(char *str){
    puts(str);    
    strrchr(str,',')[0] = '\0';//右からカット
    puts(str);  
    strchr(str, ',')[0] = '\0';//左からカット
    puts(str);
}

このプログラムは返り値のNULLチェックを行っていないので、
カンマが見つからないと
NULLポインタ間接参照が発生して
異常終了する可能性があります。


返り値のNULLチェックをする

void check(char *str){
    puts(str);  
    char *r = strrchr(str,',') ;
    if(r){
        r[0] = '\0';//右からカット
    }
    puts(str);  
    char *l = strchr(str, ',') ;
    if(l){
        l[0] = '\0';//左からカット
    }
    puts(str);
}

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


まとめ(コンパイル可能)

#include <stdio.h>
#include <string.h>
void nocheck(char *str){
    puts(str);    
    strrchr(str,',')[0] = '\0';//右からカット
    puts(str);  
    strchr(str, ',')[0] = '\0';//左からカット
    puts(str);
}
void check(char *str){
    puts(str);  
    char *r = strrchr(str,',') ;
    if(r){
        r[0] = '\0';//右からカット
    }
    puts(str);  
    char *l = strchr(str, ',') ;
    if(l){
        l[0] = '\0';//左からカット
    }
    puts(str);
}
int main(void){
    char    str1[] = "111,222,333,444,555";
    check(str1);

    char    str2[] = "aaa,bbb,ccc,ddd,eee";
    nocheck(str2);

    char    str3[] = "aaabbbcccdddeee";
    nocheck(str3);//Segmentation fault (コアダンプ)
}

実行結果

./a.out
111,222,333,444,555
111,222,333,444
111
aaa,bbb,ccc,ddd,eee
aaa,bbb,ccc,ddd
aaa
aaabbbcccdddeee
Segmentation fault (コアダンプ)

参考:

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