2

所以我开始拆分环境路径,我把它们都搞定了

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/

我需要解决什么问题才能得到所有末尾带有“/”的行?

4

3 回答 3

2

您不能修改 strtok 返回的值。您将它们延长 1 个字符,这意味着您正在写入字符串的末尾,这是未定义的行为。很可能, strtok 用 a 替换了:a\0并保存了一个指向刚刚过去的指针\0,它应该是你的第二个标记的开头。但是,您将其替换\0为 a/并将 a 放在\0该点之后,现在当strtok去寻找您的下一个标记时,它发现的只是那个\0,并且假设您的字符串已完成。

不要在strtok没有先复制的情况下修改返回值。

于 2013-09-17T19:04:40.527 回答
1

我只想打印,您可能想/在格式行中添加:

printf("%s/\n",token);

您只得到一行,因为您正在使用以下行修改正在读取的缓冲区:

strncat(token, "/", sizeof(token+1));

根据文档:

将源的前 num 个字符附加到目标,加上一个终止空字符。

您应该复制令牌,然后添加尾随/.

于 2013-09-17T19:03:20.210 回答
1

你不应该尝试修改你传递给的字符串strtok(),那样你会得到非常意想不到的行为。您应该设置一个新字符串并复制指向token它的字符串,然后在那里进行连接。sizeof(token+1)也是不正确的,既因为您只是添加1到指针而不影响结果sizeof,又因为您只是以这种方式获取指针的大小。strlen()就是你要找的。

于 2013-09-17T19:03:27.533 回答