所以我开始分割环境路径了,我得到了所有这些
char *token;
char *path;
char copy[200];
char *search = ":";
char echo[] = "echo";
int main(){
path= getenv("PATH");
strncpy(copy,path,sizeof(copy)-1);
token = strtok (copy,":");
printf("%s\n",path);
while(token != NULL)
{
printf("%s\n",token);
token= strtok (NULL,":");
}
}
我想要我需要
/usr/lib64/qt-3.3/bin
/usr/NX/bin
/usr/local/bin
/usr/bin
/usr/divms/bin
/usr/local/sbin
/usr/sbin
/space/befox/bin
/space/befox/bin
现在我只需要将“/”连接到所有这些的末尾,然后让它工作但它只打印第一个。 所以这是我的代码:
char *token;
char *path;
char copy[200];
char *search = ":";
char echo[] = "echo";
char *result;
int main(){
path= getenv("PATH");
strncpy(copy,path,sizeof(copy)-1);
token = strtok (copy,":");
printf("%s\n",path);
while(token != NULL)
{
result = strncat (token,"/",sizeof(token+1));
printf("%s\n",token);
token= strtok (NULL,":");
}
}
现在我得到:
/usr/lib64/qt-3.3/bin/
我需要修复哪些内容,以便在结尾处获得所有带有“/”的行?
答案 0 :(得分:2)
您无法修改strtok返回的值。你将它们延长了1个字符,这意味着你正在写一个字符串的结尾,这是未定义的行为。很有可能,strtok用:
替换\0
,并保存指向刚刚超过\0
的指针,该指针应该是第二个令牌的开头。但是,您将\0
替换为/
并将\0
置于该点之后,现在当strtok
去寻找您的下一个令牌时,它发现的全部是那个\0
并假设你的字符串已经完成。
请勿在不复制strtok
的情况下修改{{1}}的返回值。
答案 1 :(得分:1)
我只想打印,您可能希望在格式行中添加/
:
printf("%s/\n",token);
您只获得一行,因为您正在使用以下行修改正在阅读的缓冲区:
strncat(token, "/", sizeof(token+1));
根据文件:
将源的前几个num字符追加到destination,再加上一个终止的空字符。
您应该复制令牌,然后添加尾随/
。
答案 2 :(得分:1)
您不应该尝试修改传递给strtok()
的字符串,这样会产生非常意外的行为。您应该设置一个新字符串并将token
指向的字符串复制到该字符串,并在那里进行连接。 sizeof(token+1)
也不正确,因为你只是在指针上添加1
而根本不影响sizeof
的结果,因为你只是得到了指针的大小这条路。 strlen()
是您正在寻找的。 p>