C语言中输入整数后如果按了回车符后进入下面的程序时之前的回车符会留着缓冲区下,之后如果执行到输入字符的程序,回车符会把这个字符直接顶掉,从而出现明明写了需要输入字符缺直接被跳过的情况。
解决方法:
1、调整输入的顺序,先输入字符,再输入整数。
2、scanf("%*[^\n"),scanf("%*c") 必须在确定有垃圾数据的情况才能使用,否则必须补一个回车符。
3、stdin->_IO_read_ptr = stdin->_IO_read_end;
把输入缓冲区当前位置指针调整到缓冲区的末尾。
只能在Linux下使用,不能跨平台。
程序实例
专门挑选了在学习中遇到的典型的程序
学习普通链表编写学生管理系统的程序中
void add_stu(void)
{
Student* stu = malloc(sizeof(Student));
printf("请输入学生的学号 姓名 成绩");
scanf("%u %s %f",&stu->id,stu->name,&stu->score);
add_tail_list(list,stu);
}
void del_stu(void)
{
stdin->_IO_read_ptr = stdin->_IO_read_end;
printf("请选择按姓名删除(n),还是学号删除(i):");
if('n'==getch())
{
char name[20] = {};
printf("请输入要删除的姓名:");
gets(name);
int cmp(const void* ptr1,const void* ptr2)
{
const Student* stu = ptr1;
const char* name = ptr2;
return strcmp(stu->name,name);
}
printf("%s",name);
printf("删除%s\n",del_value_list(list,name,cmp)?"成功":"失败");
}
else
{
size_t id = 0;
printf("请输入要删除的学号:");
scanf("%u",&id);
int cmp(const void* ptr1,const void* ptr2)
{
const Student* stu = ptr1;
const size_t* id = ptr2;
if(stu->id>*id)
return 1;
else if(stu->id<*id)
return -1;
else
return 0;
}
printf("删除%s\n",del_value_list(list,&id,cmp)?"成功":"失败");
}
}
void show_stu(void)
{
void show(const void* ptr)
{
const Student* stu =ptr;
printf("%u %s %g\n",stu->id,stu->name,stu->score);
}
show_list(list,show);
}
int main()
{
list = creat_list();
add_stu();
show_stu();
del_stu() ;
}
//先执行的add_stu();结尾输入的score后执行del_stu()程序不加这行stdin->_IO_read_ptr = stdin->_IO_read_end; 之前的回车会把if(‘n’==getch()) 直接顶掉从而出现明明写了输入程序却不出现让你输入选项的情况