c - 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
在这种情况下如何工作?从昨天开始我就真的在考虑这个问题,我想知道更多。
对于这么小的“问题”,抱歉这么长的文字
解决方案
我发现知道我的代码出了什么问题。
我试图读取我当前的路径目录并将其存储在一个数组中,该数组的大小是我试图根据我的路径长度读取的。
但是,我没有正确理解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);
}
推荐阅读
- docker - Docker 从 Windows 上的 tar 推送 Linux 映像
- excel - Excel,通过从上一个表中复制数据来添加或删除
- matlab - 将 Newton Raphson 和 Gauss Seidel 用于非线性系统
- r - 如何根据 R 中的共同名称组合数据框?
- mysql - 如何从MYSQL中的其他列运行减法
- sql - 用于计算 DATEDIFF 的 AVG 的 SQL 查询
- unit-testing - EasyMock 对象的字段/属性可以通过外部方法修改吗?
- asp.net - IE11 在加载打印预览时重新请求内容时不发送表单身份验证 cookie
- tensorflow - 在训练 GAN 时,是否应该在禁用训练时禁用判别器中的 dropout?
- bash - 仅当列的值存在于文本文件中时才从 .anno 文件中获取行