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()