我正在寫一個玩具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