6

如何在不使用orscanf()的情况下用 C 完成句子fgets()gets()

我想从用户扫描命令行并根据第一个单词识别命令。例如:mkdir

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

我的代码:

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

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

4

3 回答 3

12

您的问题很可能在这里:

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

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

"50"双引号内是字符串文字。当sizeof()应用于字符串文字时,您将获得字符串中的字符数,包括 terminating NUL。所以你只为ch.

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

char* ch = malloc (50);

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

while (strcmp (ch, "exit"))

永远不会成为现实,你会得到一个无限循环。在 之后使用换行符scanf()以避免此问题:

scanf ("%[^\n]%*c", ch);

意思是“%*c读取一个字符然后丢弃它”。所以它会读取\n缓冲区中剩下的内容,然后不会将其保存在任何地方。因此,您的 nextscanf()不会\n在缓冲区的开头遇到 a ,并且您的程序将按您的意愿运行。

于 2013-08-31T10:27:43.400 回答
1
#include<stdio.h>
int main()
{
    char  input_string[100];
    scanf("%[^\n]s",&input_string);
    printf("Hello ,world.\n");
    printf("%s",input_string);
    return 0;
}
于 2016-06-30T03:38:56.377 回答
0

scanf("%[^\n]s",s);这样你也可以使用scanf("%[^\n]%*c", s);wheres被定义为char s[MAX_LEN]where MAX_LENs. 这里,[]是扫描集字符。^\n代表在没有遇到换行符之前接受输入。然后,%*c,它读取换行符,这里, used*表示这个换行符被丢弃。

于 2019-01-07T06:21:50.303 回答