在我编程的第一年,我被要求编写一个程序来模仿 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在这种情况下如何工作?从昨天开始我就真的在考虑这个问题,我想知道更多。
对于这么小的“问题”,抱歉这么长的文字