【问题标题】:chdir(<directory>) doesn't change directory: No such file or directorychdir(<directory>) 不更改目录:没有这样的文件或目录
【发布时间】:2021-07-17 15:39:43
【问题描述】:

我想创建一个简单的 c++ 程序,改变目录。

int main(int argc, char * argv[]){
//...
char input[256];
char *command;

//read command
fgets(input, 256, stdin);

// CODE ADDED WITH HELP
command = strchr(input, '\n');
    
if(command){
    *command = '\0';
}
// CODE ADDED WITH HELP

if(strncmp(input, "cd ",3)==0){
    strtok(input, " ");
    command = strtok(NULL, "\0");
    if(chdir(command) != 0){
        perror("Error while changing directory. Please try again!");
    }
}
//...
}

在上面的程序中,您可以看到注释“CODE ADDED WITH HELP”之间的代码。这是之后添加的。该程序现在可以工作,但我试图了解为什么它现在可以工作,为什么以前不能。

如果您认为添加的代码片段我在尝试更改目录时收到错误“没有这样的文件或目录”。在我得到一些帮助并添加了几行代码后,我现在可以成功更改目录了。

我试图了解这段代码在我想要实现的目标的上下文中究竟做了什么,以及为什么没有它它就无法工作。

【问题讨论】:

    标签: c++ unix directory chdir


    【解决方案1】:
    fgets(input, 256, stdin);
    

    这会读取一行文本,包括结尾的换行符Enter 键生成“换行符”字符,它是输入的一部分。

    chdir(command);
    

    除非采取其他措施,否则尾随换行符将保留在 command 中。

    计算机编程的黄金法则是:“您的计算机将始终完全按照您的指示执行操作,而不是您希望它执行的操作”。因此,假设您有一个名为“book”的子目录,并且您输入了“book”作为程序的输入。

    由于上述原因,command 的内容将是 "book\n",并且将尝试将当前目录更改为名称为 "book\n" 的目录,即“book”后跟换行符。这将是您将告诉您的计算机执行的操作。由于没有这样的目录,您的计算机将无法执行您的请求。

    添加的代码只是查找尾随换行符,它始终是输入的最后一个字符,并将其替换为'\0'。所示代码使用 C 风格的字符串,以 '\0' 字符结尾(原始读取输入以换行符结尾,fgets 有助于在其后添加原始 '\0' 字符,可以高枕无忧) .结局。

    【讨论】:

    • 谢谢,我明白了。最后一个问题:为什么我需要 if 条件 if(command)...。这样做的目的是什么?
    • 这是最后一个细节,锦上添花。可以不通过按下Enter 来终止输入,而是通过生成“文件结尾”条件的击键来终止输入,通常是CTRL-ZCTRL-D,具体取决于操作系统。这最终会导致在没有尾随换行符的情况下读取输入。或者,程序的输入,标准输入,甚至可能不是终端,而是从不以换行符结尾的文件重定向。因此,在这种情况下,搜索 '\n' 会失败。
    猜你喜欢
    • 2012-11-15
    • 2015-04-09
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 2020-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多