こんんちは。
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"となってしまうみたい
なのですが、そう言うものなのでしょうか?
> 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 );
> char szBuffer[256];
コイツの用途が間違っていました。
訂正
char libvar[ MAX_PATH ];
sprintf( libvar, "%s%s", getenv( "TEST1" ), Cd_Add );
お返事ありがとうございます。
>getenv( "TEST1" )で取得できる文字列を書き換えてしまっています。
とは、どういう意味なのでしょうか?
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" );
}
と同じこようなことをやっているのです。
返事が送れてごめんなさい。
Blue さん ありがとうございました。
ツイート | ![]() |