我正在写一个玩具bash外壳。我现在的目标是在环境中循环寻找特定命令的路径。现在我通过“:”分隔PATH(例如“/home/user/bin:home/user/.local/bin:/usr/local/sbin”等),并且对于每个给我的路径,复制路径到新字符串finalPath
,然后将“/ cmd”连接到结尾。strtok()覆盖其源字符串
我的问题是,当我尝试将路径的内容复制到finalPath
时,我对finalPath
所做的任何更改都会反映到路径上。由于代码现在,path
将只设置为“home/user/bin”一次,循环并重新设置为相同的事物,然后标记器点击“NULL”并终止while循环。
这表明path
和finalPath
共享一个内存地址,但由于理论上strcpy的进行新的副本在内存中,我必须做一些错误与我的琴弦和指针。
任何想法是什么导致这种意外的行为?
编辑:此代码执行时,我注释掉的strcpy
我的代码的精简版本,正如预期低于:
int findpath(char* cmd, command_t* p_cmd) {
char* path_var;
path_var = getenv("PATH");
char* path;
char tempEnv[sizeof(path_var)];
strcpy(tempEnv, path_var);
path = strtok(tempEnv, ":");
while(path != NULL) {
char fullPath[1000];
strcpy(finalPath, path);
printf("path: %s\n", path);
printf("finalPath: %s\n", finalPath);
path = strtok(NULL, ":");
}
是的,'strtok'确实改变了源字符串。这是记录的行为。 – alain
'sizeof(path_var)'不是'path_var'的长度。它是指针大小。 – BLUEPIXY
Strtok改变源字符串是好的,这是strcpy我很困惑。编辑:一些澄清是,当我注释掉strcpy时,此代码循环良好 – teleTele