gpt4 book ai didi

c - 如何在C中扫描完整的句子

转载 作者:行者123 更新时间:2023-12-03 23:32:12 25 4
gpt4 key购买 nike

如何在不使用 scanf()fgets() 的情况下在 C 中对完整句子进行 gets()
我想从用户扫描命令行并根据第一个单词识别命令。
例如:
目录

所以我需要认识到用户想要创建一个名为“dir_name”的新目录。

我的代码:

int main(){
char *ch=malloc(sizeof("50");
while (strcmp(ch,"exit")!=0){
scanf("%[^\n]",ch);
}

当我在输入第一句话并按 Enter 后运行此代码时,它进入无限循环,我不知道为什么?

最佳答案

您的问题很可能在这里:

char *ch=malloc(sizeof("50");

首先,您缺少一个右括号。但是假设这是发布问题而不是您的实际代码中的错字,则存在更深层次的问题。

双引号内的 "50" 是字符串文字。当 sizeof() 应用于字符串文字时,您将获得字符串中的字符数,包括终止 NUL 。所以你只为 ch 中的三个字符分配空间。

当您尝试对输入进行 scanf() 时,您正在写入超过三字符缓冲区 ch 的末尾。省略 sizeof() 并简单地说:
char* ch = malloc (50);

此外,扫描集 %[^\n] 不会 而不是 跳过前导空格。您的第一个 scanf() 将停在换行符处,它将保留在缓冲区中。 scanf() 循环中的后续 while 调用将遇到该换行符并尽职尽责地停止,因为它已从您的扫描集中排除。所以循环条件
while (strcmp (ch, "exit"))

永远不会变成真的,你会得到一个无限循环。在 scanf() 之后使用换行符来避免这个问题:
scanf ("%[^\n]%*c", ch);
%*c 的意思是“读取一个字符然后丢弃它”。所以它将读取留在缓冲区中的 \n,然后不将其保存在任何地方。因此,您的下一个 scanf() 将不会在缓冲区的开头遇到 \n,并且您的程序将按您的预期工作。

关于c - 如何在C中扫描完整的句子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18547004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com