我有代码从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"
。
答案 0 :(得分:4)
您不允许修改getenv()
返回的字符串。 strtok()
用空字符替换分隔符字符,因此您违反了此限制。 getenv()
的典型实现通过将指针直接返回到环境字符串中来工作,因此您将影响它在未来调用中搜索环境的方式。最初,您的环境包含
path=a;b;c;d\0
当您调用strtok()
时,它将所有分号替换为空字节:
path=a\0b\0c\0d\0
因此,当您下次调用getenv("path")
时,它会返回指向此的指针,第一个\0
将终止环境变量。
您应该复制evnValue
并使用strtok()
。