パスワードを忘れた? アカウント作成
622006 journal

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 );
}

こんな感じかなぁ。
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • それで間違ってはいない(だろう)ということは、まず先に書いておきます。

    その上で細かい突っ込みをすると。

    >    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 );

    バグありましたね :)
typodupeerror

UNIXはシンプルである。必要なのはそのシンプルさを理解する素質だけである -- Dennis Ritchie

読み込み中...