getenv 環境変数取得について

解決


GABA  2006-04-05 09:40:56  No: 61134  IP: 192.*.*.*

こんんちは。
getenvについて質問です。

環境変数 TEST1→C:\TEST\env
#define Cd_Add  "\\TEST.INI"

char szBuffer[256];
char *libvar;

libvar = getenv( "TEST1" );
strcat(libvar, Cd_Add );
int rc = GetPrivateProfileString(_T("TEST"), _T("TEST_DEF"), NULL, szBuffer, sizeof(szBuffer), _T(libvar));

と言う感じでINIファイルを取得しているのですが、
1回目は正常に取得出来るのですが、
2回目から、"C:\TEST\env\TEST.INI\TEST.INI"となってしまいます。
デバックで見ると、2回目のgetenv(... を使用した際、
"C:\TEST\env\TEST.INI"と取得してしまう為、
その後の連結で"C:\TEST\env\TEST.INI\TEST.INI"となってしまうみたい
なのですが、そう言うものなのでしょうか?

編集 削除
Blue  2006-04-05 09:44:49  No: 61135  IP: 192.*.*.*

> libvar = getenv( "TEST1" );
> strcat(libvar, Cd_Add );
ここが問題です。
getenv( "TEST1" )で取得できる文字列を書き換えてしまっています。
# 場合によっては、メモリアクセスエラーがでるかもしれません。

一度別バッファに格納しなおしてから、strcatするか、sprintf関数を使ってください。

char szBuffer[256];
char *libvar;

libvar = getenv( "TEST1" );
sprintf( szBuffer, "%s%s", libvar, Cd_Add );

編集 削除
Blue  2006-04-05 09:46:17  No: 61136  IP: 192.*.*.*

> char szBuffer[256];
コイツの用途が間違っていました。

訂正
char libvar[ MAX_PATH ];
sprintf( libvar, "%s%s", getenv( "TEST1" ), Cd_Add );

編集 削除
GABA  2006-04-05 09:56:51  No: 61137  IP: 192.*.*.*

お返事ありがとうございます。
>getenv( "TEST1" )で取得できる文字列を書き換えてしまっています。
とは、どういう意味なのでしょうか?

編集 削除
Blue  2006-04-05 10:22:01  No: 61138  IP: 192.*.*.*

char *libvar;
char *p;

libvar = getenv( "TEST1" );
/* 確認用 */
printf( "libvarの値は %p\n", ( void* )libvar );
strcat(libvar, Cd_Add );

p = getenv( "TEST1" );
/* 確認用 */
printf( "pの値は %p\n", ( void* )p );

で同じ値になることがわかります。ということはやっていることは

int main( void )
{
    char buff[ 20 ] = "";
    char *p, *q;

    p = buff;
    strcat( p, "ABC" );

    q = buff;
    strcat( q, "abc" );
}

と同じこようなことをやっているのです。

編集 削除
GAVA  2006-04-06 10:04:58  No: 61139  IP: 192.*.*.*

返事が送れてごめんなさい。

Blue さん ありがとうございました。

編集 削除