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);} 展开
问题:
当我在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);} 展开
展开全部
先解释为什么没办法输入name。
执行这条scanf("%d",&p->number);
之后通过屏幕输入的内容实际为一个整数+一个换行符,
儿scanf只读取了一个整数,而换行符依旧存在缓冲区中。
gets函数会读取字符知道遇到换行符,对于当前的情况来说,其第一个字符就是换行符,所以,它只读取一个换行符。gets函数在执行完读取操作之后,会将换行符转换为\0,这也就是我们为什么看不到内容的原因。
insert修改的方法:在scanf函数调用之后添加一个情况缓存的操作:
fflush(stdin);
这样insert就可以工作了。
执行这条scanf("%d",&p->number);
之后通过屏幕输入的内容实际为一个整数+一个换行符,
儿scanf只读取了一个整数,而换行符依旧存在缓冲区中。
gets函数会读取字符知道遇到换行符,对于当前的情况来说,其第一个字符就是换行符,所以,它只读取一个换行符。gets函数在执行完读取操作之后,会将换行符转换为\0,这也就是我们为什么看不到内容的原因。
insert修改的方法:在scanf函数调用之后添加一个情况缓存的操作:
fflush(stdin);
这样insert就可以工作了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询