fgets() 函数无法识别数据

fgets() function doesn't recognise the data

我目前正在构建自己的 shell。 我设法使用 scanf() 使 ls 起作用,现在我在 cd 上。但我意识到 cd 和文件之间有 space,所以我将 scanf() 更改为 fgets()。

space的问题解决了,但是又出现了一个问题。即使我输入正确,程序也无法运行。

char command[MAX_LEN];
int result = 1;
char *pwd[MAX_LEN];

do {
    printf("%s > ", getcwd(pwd, 100));
    fgets(command, 100, stdin);

    if(!strcmp("cd", command))
        change_dir();

    if(!strcmp("ls", command))
        list_dir();

} while(strcmp("exit", command));

return 0;

我的代码有什么问题?你能告诉我为什么会这样吗?

fgets 最多读取 size-1 个字符(在你的例子中是 100-1 所以 99)并在字符串的末尾放置一个 '\0',所以当你在 stdin 中键入 "ls" 并点击输入,fgets 将收到 "ls\n" 因为输入创建了一个 \n 字符,命令将是 "ls\n[=18=]" 因为 \0 表示字符串的结尾,我们现在可以在这里忽略它。

当您使用 strcmp("ls",command) 时,您正在将 "ls" 与命令中在 \0 之前结束的字符串进行比较,因此 "ls\n" 因为 "ls" 和 "ls\n"不一样,会失败。

正如其他人已经说过的,您可以将 \n 添加到您的比较字符串中,或​​者删除 \n 由于您可能计划在 cd 或 ls 之后的行中添加更多内容,因此您可以查看字符串分隔,例如用 strtok()