-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". 当它运行时,如果第一次输入字符串“path”,它运行良好,但如果再次输入“path”,它只会得到第一个字符串,如"a"or "a;b"

4

1 回答 1

4

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

path=a;b;c;d\0

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

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

所以当你getenv("path")下次调用时,它会返回一个指向 this 的指针,并且第一次\0终止环境变量。

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

于 2016-01-28T03:16:32.487 回答