解析$ PATH变量并将目录名保存到字符串数组中
我想解析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, ":"); }
您的代码有两个主要问题,评论几乎总结如下:
- 你strtok一个公共缓冲区(由
getenv
返回) - 你不知道缓冲区中有多少变量,所以根本不分配数组数组!
让我提出一个不使用strtok的工作实现,从而允许检测空路径(并将其替换为.
如Jonathan暗示的那样)。 使用gcc -Wall -Wwrite-strings
编译时没有任何警告:
#include #include #include int main() { const char **array; const char *orig_path_var = getenv("PATH"); char *path_var = strdup(orig_path_var ? orig_path_var : ""); // just in case PATH is NULL, very unlikely const char *the_dot = "."; int j; int len=strlen(path_var); int nb_colons=0; char pathsep = ':'; int current_colon = 0; // first count how many paths we have, and "split" almost like strtok would do for (j=0;j\n",j,array[j]); } return(0); }
操作细节:
- 制作一个env字符串的副本,以避免屠杀它
- 计算冒号(使其适用于窗口,只需替换为
;
)和tokenize - 根据冒号+ 1分配数组(比分隔符数多1个令牌!)
- 第二次传递再次通过字符串并用标记化字符串的部分填充(不需要再次分配,原始字符串已经分配)
- 特例:空路径:替换为
.
。 可以显示警告,告诉用户这不安全。 - 打印结果