T.Fujikiの日記: key=val をスプリット 1
日記 by
T.Fujiki
char *k;
char *v;
char *s = NULL;
char **p;
for( p = environ; *p != NULL; p++ ){
s = (char *)malloc( sizeof(char)*(strlen(*p)+1) );
if( s == NULL ){
えらーしょり;
}
strncpy( s, *p, strlen(*p)+1 );
k = s;
v = strchr( s, '=' );
if( v == NULL ) continue;
*v = '\0';
v++;
printf( "%s: %s\n", k, v );
free( s );
}
こんな感じかなぁ。
char *v;
char *s = NULL;
char **p;
for( p = environ; *p != NULL; p++ ){
s = (char *)malloc( sizeof(char)*(strlen(*p)+1) );
if( s == NULL ){
えらーしょり;
}
strncpy( s, *p, strlen(*p)+1 );
k = s;
v = strchr( s, '=' );
if( v == NULL ) continue;
*v = '\0';
v++;
printf( "%s: %s\n", k, v );
free( s );
}
こんな感じかなぁ。
だいぶ前のようですけど細かいところを (スコア:1)
その上で細かい突っ込みをすると。
> s = (char *)malloc( sizeof(char)*(strlen(*p)+1) );
sizeof(char)は規格により1になることが保証されてますので、
s = (char *)malloc( strlen(*p)+1 );
で十分です。キャストもいらないと思いますが(あ、Cですよね、C++なら話は別です)、
これは好みの問題かなとも思うのでコメントにとどめます。
次に、
> strncpy( s, *p, strlen(*p)+1 );
これは先のmalloc時に十分な大きさをsの指す先に確保してますから、
strcpyで十分かと。
あと、
> if( v == NULL ) continue;
これはよろしくありません。sがリークします。こんな感じでどうでしょう。
if( v ) {
*v = '\0';
v++;
printf( "%s: %s\n", k, v );
}
free( s );
バグありましたね :)