C:为什么';t fgets函数是否工作?

C:为什么';t fgets函数是否工作?,c,C,我正在写一个程序来创建一个链表节点。之后,我添加了一些函数(插入、搜索、更新和打印)。链表包含编号、名称和现存量 main函数提示用户输入操作代码,然后调用函数请求的操作 main() { char code; int c; for(;;) { printf("i: insert\ns: search\nu: update\np: print\n"); printf("Ente

我正在写一个程序来创建一个链表节点。之后,我添加了一些函数(插入、搜索、更新和打印)。链表包含编号、名称和现存量

main函数提示用户输入操作代码,然后调用函数请求的操作

    main()
{
        char code;
        int c;
        for(;;)
        {
            printf("i: insert\ns: search\nu: update\np: print\n");
            printf("Enter operation code: ");
            scanf("%c",&code);
            while((c=getchar() )!= '\n'&& c!=EOF);
            switch(code)
                {
                    case 'i': insert();
                        break;
                    case 's': search();
                        break;
                    case 'u': update();
                        break;
                    case 'p': print();
                        break;
                    case 'q':return 0;
                    default: printf("Illegal code\n");
                        break;
                }
            printf("\n");   
        }
}
所有功能都正常工作。但是,在insert函数中,我使用fgets语句从用户处获取字符串输入。(姓名=25)

不幸的是,这段代码不起作用。节目显示,

i: insert
s: search
u: update
p: print
Enter operation code: i
Enter part number: 2
Enter name part: Enter quantity on hand: 3
正如你所看到的,名字部分被遗漏了

此外,在插入新节点后,程序会自动在交换机中显示默认情况

i: insert
s: search
u: update
p: print
Enter operation code: i
Enter part number: 2
Enter name part: Enter quantity on hand: 3

i: insert
s: search
u: update
p: print
Enter operation code: Illegal code

你能给我解释一下发生了什么吗?

事实是,
fgets
正在消耗stdin中先前输入的
\n
。简单的方法是使用dummy
getchar()
或使用
fgets
,直到获得非空白输入

做一件事,在
scanf
之后放一个
getchar()

为了给你一个更清楚的解释,假设你输入
i
enter

然后将
i
存储到变量
code
中。但是
\n
fgets()
stdin
开始读取输入时,发现
\n
并停止。通过使用
getchar()
您已经使用了
\n
。现在,
fgets
将使用所有非空白字符,直到它找到
\n
EOF
缓冲区
满为止

冲洗stdin最方便、最干净的方法是(正确的话,
stdin
必须至少有
\n
字符,否则它还会继续吃掉其他字符(可能是您的有效输入)

无论何时遇到垃圾输入或清除stdin,都可以使用此选项

另外,要真正了解fgets函数是否工作,您需要检查它返回的内容。它是否返回
NULL
?如果没有,那么检查它,然后尝试理解。仅仅因为打印缓冲区时没有看到任何输出,并不意味着
fgets
失败


编辑

最初发布的问题提到,在
scanf(“%c”,&code)
之后有
fgets
。在这里,在编辑中可以清楚地看到
scanf(“%d”,&new\u node->number)
在fgets之前,但这不会改变场景。现在,输入的数字(您输入的
2
ENTER)后面的
\n
仍然存在,并且
fgets
会使用它。所以我们需要将dummy
getchar()
放在那里,或者上面显示的
stdin
刷新技术

scanf("%d",&new_node->number);
getchar();
^^^^
This consumes the stray `\n` 

问题是,
fgets
正在使用stdin中先前输入的
\n
。简单的方法是使用dummy
getchar()
或使用
fgets
,直到获得非空白输入

做一件事,在
scanf
之后放一个
getchar()

为了给你一个更清楚的解释,假设你输入
i
enter

然后将
i
存储到变量
code
中。但是
\n
fgets()
stdin
开始读取输入时,发现
\n
并停止。通过使用
getchar()
您已经使用了
\n
。现在,
fgets
将使用所有非空白字符,直到它找到
\n
EOF
缓冲区
满为止

冲洗stdin最方便、最干净的方法是(正确的话,
stdin
必须至少有
\n
字符,否则它还会继续吃掉其他字符(可能是您的有效输入)

无论何时遇到垃圾输入或清除stdin,都可以使用此选项

另外,要真正了解fgets函数是否工作,您需要检查它返回的内容。它是否返回
NULL
?如果没有,那么检查它,然后尝试理解。仅仅因为打印缓冲区时没有看到任何输出,并不意味着
fgets
失败


编辑

最初发布的问题提到,在
scanf(“%c”,&code)
之后有
fgets
。在这里,在编辑中可以清楚地看到
scanf(“%d”,&new\u node->number)
在fgets之前,但这不会改变场景。现在,输入的数字(您输入的
2
ENTER)后面的
\n
仍然存在,并且
fgets
会使用它。所以我们需要将dummy
getchar()
放在那里,或者上面显示的
stdin
刷新技术

scanf("%d",&new_node->number);
getchar();
^^^^
This consumes the stray `\n` 

你知道出了什么问题吗?使用fgets而不是scanf,scanf会在inbufferHint中留下一些东西提示:任何时候你开始问“为什么(插入C库函数名)函数不起作用?”--问题通常不是函数。很抱歉,我忘了输入我使用fgets函数的插入函数。我知道在使用fgets字符串之前我有一些错误,但是我找不到它们(可能在中)。你能告诉我哪里错了吗?你明白哪里错了吗?用fgets代替scanf,scanf会在inbufferHint中留下东西提示:任何时候你开始问“为什么(插入C库函数名)函数不起作用?”--问题通常不是函数。很抱歉,我忘了输入插入函数,我使用的是fgets函数。我知道在使用fgets字符串之前我有一些错误,但是我找不到它们(可能在中)。请告诉我哪里错了,好吗?这里的
while
循环是清除输入流的标准方法,但值得注意的是,输入流中必须至少有一个换行符才能按预期工作。非常感谢,但我忘了
int c;
while ((c = getchar()) != '\n' && c != EOF);
scanf("%d",&new_node->number);
getchar();
^^^^
This consumes the stray `\n`