首页 > 解决方案 > size_t 总是为 getcwd 找到合适的大小

问题描述

在我编程的第一年,我被要求编写一个程序来模仿 c 中的 shell,并带有一些基本命令。

在某些时候,我尝试实现“cd”命令来切换目录,但我对必须赋予“getcwd”函数的大小有疑问。

在手册页中,写到“getcwd”必须指定路径和大小,才能知道在哪里存储路径以及存储多少字节。

我试图根据路径的长度和字符的字节来获取大小,并且在开始时效果很好,但是在某些时候,我在现有路径比我当前的路径更大时遇到了一些问题试图去。

例如,我在 /home/$username/..... 我试图转到“/home/$username/”中的“/another_directory”,但没有从头开始输入路径,导致它没有知道目录的完整长度,但只有我的输入,并且不起作用。

我的一个朋友帮助我告诉我我可以使用“size_t”(如“man”页面所示)

我想知道“size_t”在这种情况下是如何工作的,因为它只是分配了一个足够大的大小,使一切工作正常,甚至不用自己进行 malloc。

这是代码:

{
    size_t len;
    char *path = NULL;

    if (buffarg == 1) {
        chdir("/home/cyprien"); //TODO modify cyprien to $NAME
        my_putstr("/home/cyprien\n");
    } else if (buffarg == 2) {
        path = malloc(len);
        if (chdir(buffarray[1]) == 0) {
            getcwd(path, len);
            my_putstr(path);
            my_putstr("\n");
        } else {
            my_putstr("cd: no such file or directory: ");
            my_putstr(buffarray[1]);
            my_putstr("\n");
        }
    }
    free(path);
}

我初始化size_t len;并使用它,getcwd(path, len)总能找到合适的尺寸。我的旧代码是这样的:

{
    int len = 0;
    char *path = NULL;

    if (buffarg == 1) {
        chdir("/home/cyprien"); //TODO modify cyprien to $NAME
        my_putstr("/home/cyprien\n");
    } else if (buffarg == 2) {
        path = malloc(len);
        if (chdir(buffarray[1]) == 0) {
            len += my_strlen(buffarray[1]);
            getcwd(path, len);
            my_putstr(path);
            my_putstr("\n");
        } else {
            my_putstr("cd: no such file or directory: ");
            my_putstr(buffarray[1]);
            my_putstr("\n");
        }
    }
    free(path);
}

我将 len 初始化为 int 为 0,并尝试将输入的长度添加到 size 中,以便将缓冲区存储在path字符串中。

有谁知道size_t在这种情况下如何工作?从昨天开始我就真的在考虑这个问题,我想知道更多。

对于这么小的“问题”,抱歉这么长的文字

标签: c

解决方案


我发现知道我的代码出了什么问题。

我试图读取我当前的路径目录并将其存储在一个数组中,该数组的大小是我试图根据我的路径长度读取的。

但是,我没有正确理解getcwd工作方式:

如果缓冲区getcwd设置为 NULL 并且大小getcwd设置为 0,则缓冲区将被分配到一个数组中,该数组具有为当前工作目录提供的正确大小的输入。

换句话说,无需手动完成任何操作,只需将我的 NULL 初始化数组提供给 getcwd 以返回,NULL 作为缓冲区,大小为 0,如下所示:

在开始时初始化一个缓冲区: char *path = NULL;

并在路径中返回 getcwd : path = getcwd(NULL, 0);

我的代码现在是这样的,工作正常并且所有变量都正确初始化:

void cd(char **buffarray, int buffarg)
{
    char *path = NULL;

    if (buffarg == 1) {
        chdir("/home/cyprien"); //TODO modify cyprien to $NAME
        my_putstr("/home/cyprien\n");
    } else if (buffarg == 2) {
        if (chdir(buffarray[1]) == 0) {
            path = getcwd(NULL, 0);
            my_putstr(path);
            my_putstr("\n");
        } else {
            my_putstr("cd: no such file or directory: ");
            my_putstr(buffarray[1]);
            my_putstr("\n");
        }
    }
    free(path);
}

推荐阅读