C语言的一些奇怪的表现,求高人指点。

奇怪的地方我都已经框了红色框框,请高人耐心看看运行结果可使用的函数;问题:当我在insert函数里使用gets函数时,p->name就无法输入,直接被跳过了;但主函数可以... 奇怪的地方我都已经框了红色框框,请高人耐心看看运行结果可使用的函数;
问题:
当我在insert函数里使用gets函数时,p->name就无法输入,直接被跳过了;但主函数可以正常运行;
当我把insert里改用scanf("%s")时就可以输入名字,但是主函数的flag又没有办法输入也被直接跳过了;后来改成都用scanf和getchar/gets都没有办法成功运行程序。这到底是哪里出问题了?
#include <stdio.h>#include <malloc.h>#include <string.h>typedef char Name[12];struct stu{int number;Name name;struct stu *next;};typedef struct stu Stu_link;void main(){ Stu_link *head; Stu_link *last; int n=1; char flag; Stu_link *insert(); head=(Stu_link *)malloc(sizeof(Stu_link)); head->next=NULL; last=head; do{ switch(n){ case 1: last->next=insert();last=last->next;break; case 2: case 3: default:printf("haven't choose!");break; } printf("Are you carry on?'y' or 'n':"); flag=getchar(); } while(flag=='y');}Stu_link *insert(){ Stu_link *p; p=(Stu_link *)malloc(sizeof(Stu_link)); printf("Please input number:"); scanf("%d",&p->number); printf("\nPlease input the name:"); gets(p->name); printf("lijiijljlklk\n"); p->next=NULL; printf("sfdfsdfsdf\n"); return(p);}
展开
 我来答
捷训
2013-08-10 · TA获得超过113个赞
知道答主
回答量:28
采纳率:100%
帮助的人:34.3万
展开全部
先解释为什么没办法输入name。
执行这条scanf("%d",&p->number);
之后通过屏幕输入的内容实际为一个整数+一个换行符,
儿scanf只读取了一个整数,而换行符依旧存在缓冲区中。

gets函数会读取字符知道遇到换行符,对于当前的情况来说,其第一个字符就是换行符,所以,它只读取一个换行符。gets函数在执行完读取操作之后,会将换行符转换为\0,这也就是我们为什么看不到内容的原因。

insert修改的方法:在scanf函数调用之后添加一个情况缓存的操作:
fflush(stdin);

这样insert就可以工作了。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式