解析$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, ":");
}

你的代码有2个主要的错误,几乎可以用注释来概括:

  • 你打开了一个公共缓冲区(由getenv返回)
  • 你不知道缓冲区中有多少变量,所以你根本不分配数组的数组!

让我提出一个使用strtok的not的工作实现,从而允许检测空路径(并像Jonathan暗示的那样用.替换它)。使用gcc -Wall -Wwrite-strings:

编译时没有任何警告
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
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<len;j++)
    {
        if (path_var[j]==pathsep)
        {
            nb_colons++;
            path_var[j] = '';
        }       
    }
    // allocate the array of strings
    array=malloc((nb_colons+1) * sizeof(*array));
    array[0] = path_var;  // first path
    // rest of paths
    for (j=0;j<len;j++)
    {
        if (path_var[j]=='')
        {
            current_colon++;
            array[current_colon] = path_var+j+1;
            if (array[current_colon][0]=='')
            {
                // special case: add dot if path is empty
                array[current_colon] = the_dot;
            }
        }
    }
    for (j=0;j<nb_colons+1;j++)
    {
        printf("Path %d: <%s>n",j,array[j]);
    }
    return(0);
}

操作详情:

  • 复制env字符串以避免对其进行处理
  • 计算冒号(为了使其与窗口一起工作,只需替换为;)并标记
  • 根据冒号数+ 1(比分隔符数多1个令牌)分配数组
  • 第二次遍历字符串,并使用标记化字符串的部分填充它(不需要再次分配,原始字符串已经分配)
  • 特殊情况:空路径:替换为.。可以显示警告,告诉用户这不安全。
  • 打印结果

我知道这是旧的,但我必须这样做的家庭作业,我想我应该分享我的解决方案,因为上面是有点复杂,不使用strtok。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void printStrings(const char* args[]);
int main(int argc, char const *argv[]) {
    char* path = getenv("PATH");  //gets the path
    const char* pathParts[100];   //arr to hold pointers to parts of path (whatever size)
    char* token; //holds next part of path
    token = strtok(path, ":");
    pathParts[0] = token; // place pointer to next part of path in arr
    int i = 1;
    while(token != NULL) {
        token = strtok(NULL, ":");
        pathParts[i] = token; // place pointer to next part of path in arr
        i++;
    }
    printStrings(pathParts); // print parts of path 1/line
    return 0;
}
void printStrings(const char* args[]) {
    int i = 0;
    while(args[i] != 0) {
        printf("%sn", args[i]);
        i++;
    }
}

相关内容

  • 没有找到相关文章

最新更新