
■返り値の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 (コアダンプ)
参考: