【发布时间】:2017-03-04 21:52:30
【问题描述】:
我想解析 Linux 的 $PATH 变量,然后将用 ':' 分隔的目录名保存到字符串数组中。
我知道这是一项简单的任务,但我被困住了,任何帮助都会很好。
到目前为止,我的代码是这样的,但有些地方不对。
char **array;
char *path_string;
char *path_var = getenv("PATH");
int size_of_path_var = strlen(path_var);
path_string = strtok(path_var, ":");
while (path_string != NULL) {
ss = strlen(path_string)
array[i] = (char *)malloc(ss + 1);
array[i] = path_string; //this is actually all i want to do for every path
i++;
path_string = strtok(NULL, ":");
}
【问题讨论】:
-
到底出了什么问题?您对此有何意见?
-
来自the
getenvmanual page:“正如通常实现的那样,getenv()返回一个指向环境列表中的字符串的指针。调用者必须注意不要修改此字符串,因为这会改变过程。”这对您来说是个问题,因为strtok修改标记化中的字符串。 -
您还没有为
array分配任何空间,但无论如何您都在忙着分配空间。这不是幸福的秘诀。 -
您正在为
array[i] = (char *)malloc(ss + 1);分配空间,但随后将其覆盖。考虑放弃array[i] = strdup(path_string) -
@Jean-FrançoisFabre:如果PATH中有一个前导冒号
:,或者中间有两个相邻的冒号,或者一个尾随冒号,那么在前面有一个隐含的.条目,在在引用的冒号之间或之后 - 也就是说,当前目录位于 PATH 上,即使.在 PATH 中不可见。问题是,strtok()允许多个相邻的分隔符,并且无法识别空字段。您也可以在开头、中间或结尾添加.:或:.:或:.,但这是明确的,strtok()不会丢失该信息。