-1

スタンド入力から環境変数名を取得し、ライブラリ関数getenv()を呼び出して値と出力を取得するコードがあります。

ここにコードがあります。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAXLEN 256

int main(void)

{
    char *envName;
    char *envValue;
    char *envEntry;
    char *envVar=(char*)malloc(sizeof(char)*MAXLEN);

    while(NULL!=(envName=gets(envVar))){

    envValue=getenv(envName);
    if(envValue){
        printf("%s\n",envValue);

        envEntry=strtok(envValue,";");

        while(envEntry){
            printf("%s\n",envEntry);

            envEntry=strtok(NULL,";");
        }
    }else{
        printf("not found\n");
    }
}

    return 0;
}

環境変数"path""a;b;c;d". 実行中に、最初に文字列「パス」を入力するとうまく機能しますが、もう一度「パス」と入力すると、"a"またはのような最初の文字列しか取得されません"a;b"

4

1 に答える 1

4

getenv()返される文字列を変更することはできません。strtok()区切り文字をヌル文字に置き換えるため、この制限に違反しています。ポインターを環境文字列に直接返すことによって機能する典型的な実装であるgetenv()ため、将来の呼び出しで環境を検索する方法に影響を与えます。もともと、あなたの環境には含まれていました

path=a;b;c;d\0

を呼び出すとstrtok()、すべてのセミコロンがヌル バイトに置き換えられました。

path=a\0b\0c\0d\0

したがってgetenv("path")、次に呼び出すと、これへのポインターが返され、最初の呼び出し\0で環境変数が終了します。

これをコピーしevnValueて使用する必要がありますstrtok()

于 2016-01-28T03:16:32.487 に答える