c - fgets() 函数无法识别数据

标签 c fgets

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

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

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”并按 Enter 键时,fgets 将接收“ls\n”,因为 Enter 创建一个\n 字符,命令将为“ls\n\0” 因为\0 表示字符串的结尾,所以我们现在可以忽略它。

当您 strcmp("ls",command) 时,您正在将“ls”与命令中以\0 结尾的字符串进行比较,因此“ls\n”因为“ls”和“ls\n”不同,它会失败。

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

关于c - fgets() 函数无法识别数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60264670/

相关文章:

c - 位转换 float 到 int

c - C中转义字符的大小

c - 使用 fgets() 从不同的管道读取,从两者读取相同的消息(应该不同)

c - 我们是否需要显式关闭写端已经关闭的管道的读端?

c - 使用 C 中的 fgets 将文本文件解析为多个变量

c++ - OpenCV 错误 : Sizes of input arguments do not match (The operation is neither 'array op array' )

c - 在 Unix 上执行共享库

c - “program.exe has stopped running”尝试了一切,但无济于事?

c++ - 使用 fgets 作为非阻塞函数 c++

c - fgets 和 sscanf