C strncat到我的环境

时间:2013-09-17 18:57:51

标签: c

所以我开始分割环境路径了,我得到了所有这些

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/

我需要修复哪些内容,以便在结尾处获得所有带有“/”的行?

3 个答案:

答案 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()是您正在寻找的。