多次调用时出现Getenv()错误

时间:2016-01-28 03:01:41

标签: c getenv

我有代码从stand输入获取环境变量名称,并调用库函数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"。 当它运行时,如果键入一个字符串&#34; path&#34;第一次,它运作良好,但如果键入&#34;路径&#34;再次,它只获得第一个字符串,如"a""a;b"

1 个答案:

答案 0 :(得分:4)

您不允许修改getenv()返回的字符串。 strtok()用空字符替换分隔符字符,因此您违反了此限制。 getenv()的典型实现通过将指针直接返回到环境字符串中来工作,因此您将影响它在未来调用中搜索环境的方式。最初,您的环境包含

path=a;b;c;d\0

当您调用strtok()时,它将所有分号替换为空字节:

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

因此,当您下次调用getenv("path")时,它会返回指向此的指针,第一个\0将终止环境变量。

您应该复制evnValue并使用strtok()