C strncat到我的环境

C strncat到我的环境,c,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(to

因此,我开始分割环境路径,我得到了它们

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/

我需要修复什么,以便在所有行的末尾都有一个“/”?

如果您只想打印,您可能需要在格式行中添加
/

printf("%s/\n",token);
您只得到一行,因为您正在使用以下行修改正在读取的缓冲区:

strncat(令牌“/”,sizeof(令牌+1))

根据文件:

将源的第一个num字符加上终止的null字符追加到目标


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

如果您只想打印,您可能需要在格式行中添加
/

printf("%s/\n",token);
您只得到一行,因为您正在使用以下行修改正在读取的缓冲区:

strncat(令牌“/”,sizeof(令牌+1))

根据文件:

将源的第一个num字符加上终止的null字符追加到目标


您应该复制标记,然后添加尾随的
/
您不应该试图修改传递给
strtok()
的字符串,这样会出现非常意外的行为。您应该设置一个新字符串,并将
标记所指向的字符串复制到该字符串中,然后在那里进行连接
sizeof(token+1)
也不正确,这是因为您只是将
1
添加到指针,并且根本不影响
sizeof
的结果,而且您只是通过这种方式获得指针的大小
strlen()
是您要查找的内容。

您不应该试图修改传递给strok()
的字符串,这样会出现非常意外的行为。您应该设置一个新字符串,并将
标记所指向的字符串复制到该字符串中,然后在那里进行连接
sizeof(token+1)
也不正确,这是因为您只是将
1
添加到指针,并且根本不影响
sizeof
的结果,而且您只是通过这种方式获得指针的大小
strlen()
是您要查找的内容。

您不能修改strok返回的值。您将它们的长度延长了1个字符,这意味着您正在写入超过字符串结尾的内容,这是未定义的行为。strtok很可能会将
替换为
\0
,并保存一个指向刚好经过
\0
的指针,该指针应该是第二个令牌的开始。但是,您将该
\0
替换为一个
/
,并将一个
\0
放在刚好超过该点的位置,现在当
strtok
查找下一个标记时,它只会找到
\0
,并假定字符串已完成


如果不先复制,请不要修改strok的返回值。

您不能修改strok返回的值。您将它们的长度延长了1个字符,这意味着您正在写入超过字符串结尾的内容,这是未定义的行为。strtok很可能会将
替换为
\0
,并保存一个指向刚好经过
\0
的指针,该指针应该是第二个令牌的开始。但是,您将该
\0
替换为一个
/
,并将一个
\0
放在刚好超过该点的位置,现在当
strtok
查找下一个标记时,它只会找到
\0
,并假定字符串已完成


如果不先复制,请不要修改strtok中的返回值。

您如何知道
$PATH
的值适合200字节?在
path=getenv(“path”)之后
,我会调用strlen(path)
,然后使用
malloc
分配一个缓冲区。OP对
result=strncat(token,“/”,sizeof(token+1))中的
result
不做任何操作。可能需要
printf(“%s\n”,result)
?您如何知道
$PATH
的值可以容纳200字节?在
path=getenv(“path”)之后
,我会调用strlen(path)
,然后使用
malloc
分配一个缓冲区。OP对
result=strncat(token,“/”,sizeof(token+1))中的
result
不做任何操作。可能OP想要
printf(“%s\n”,result)
?我也尝试过复制它,就像在concat i id之前有一个*char copyt=token一样thing@user1547386:这是复制指针,而不是复制字符串。您需要查看
malloc()
strcpy()
。malloc不是严格必需的,例如,如果您知道您的令牌长度都小于200个字符,您可以执行
char temp[202];strncpy(临时,令牌,200);温度[200]='\0';strncat(温度,“/”,2)
@Dan:True,尽管您希望每次都进行检查,但特别是带有文件名的
strncpy()<代码>sprintf()
在这里可能比
strncpy()
后面跟着
strncat()
更容易。我也尝试过复制它,比如在concat i id之前有一个*char copyt,copyt=令牌仍然做同样的事情thing@user1547386:这是复制指针,而不是复制字符串。您需要查看
malloc()
strcpy()
。malloc不是严格必需的,例如,如果您知道您的令牌长度都小于200个字符,您可以执行
char temp[202];strncpy(临时,令牌,200);温度[200]='\0';strncat(温度,“/”,2)
@Dan:True,尽管您希望每次都进行检查,但特别是带有文件名的
strncpy()
sprintf()
在这里可能比
strncpy()
后面跟着
strncat()