主题:怎么样解决这个错误
zlinsc
[专家分:0] 发布于 2010-05-26 13:21:00
void putnum()
{
scanf("%d",&pn);
if(pn<1||pn>M)
{
printf("Error!\nPlease input again: ");
putnum();
}
}
M=100
输入数值的话没问题,但是输入字符(例如a)的话,就会出现死循环的错误:
Please input again: Error!
Please input again: Error!
Please input again: Error!
Please input again: Error!
Please input again: Error!
````
最后崩溃。
应该怎样解决这个问题呢?
最后更新于:2010-05-26 13:22:00
回复列表 (共9个回复)
沙发
耶路撒冷 [专家分:650] 发布于 2010-05-26 15:08:00
在 scanf("%d",&pn);后面加上
fflush(stdin)
或者:
flushall() 来清空缓冲区看看
板凳
flyer103 [专家分:60] 发布于 2010-05-26 15:27:00
在scanf()中你要求输入的是%d型,但如果输入的是字符的话,编译器可能会把字符当作一个变量对待,pn指向输入的变量的地址,而输入的这个变量又没有分配空间,所以会出现段错误。我对指针掌握的不太好,觉得是这里的问题。你可以把%d换成%c,输入字符(即短整型),这样问题可以避免.
3 楼
zlinsc [专家分:0] 发布于 2010-05-26 17:13:00
[quote]在 scanf("%d",&pn);后面加上
fflush(stdin)
或者:
flushall() 来清空缓冲区看看[/quote]
可以是可以,但是我后面有一段函数:
void input(char nam[][N],int num[])
{
int i;
for(i=0;i<pn;i++)
{
printf("%d.Name: ",i+1);
getchar();
gets(nam[i]);
printf("Number: ");
scanf("%d",&num[i]);
}
}
void output(char nam[][N],int num[])
{
int j;
printf("\n");PR;
printf("\nThe employee list display as follow:\n ROW NAME NUMBER\n");
for(j=0;j<pn;j++)
printf(" %-8d%-12s%-12d\n",j+1,nam[j],num[j]);
PR;printf("\n");
}
假设在scanf("%d",&pn);我输入2,并且接下来的函数我输入
1.Name:a
Number:1
2.Name:b
Number:2
输出的话是
ROW NAME NUMBER
1 1
2 b 2
其中a就不见了。
你能不能解释一下fflush(stdin)和flushall()的作用?
4 楼
雪光风剑 [专家分:27190] 发布于 2010-05-26 19:18:00
fflush(stdin);其实是个未定义行为,语意上看是强制刷新标准输入流(输入缓冲区)。flushall则是强制刷新所有缓冲区
5 楼
zlinsc [专家分:0] 发布于 2010-05-26 22:31:00
那怎么改
6 楼
耶路撒冷 [专家分:650] 发布于 2010-05-26 22:39:00
4楼正解,详细内容,请Google一哈
7 楼
ciacada [专家分:10] 发布于 2010-05-27 23:18:00
把你全部代码都发上来吧,你给的这些都衔接不上,看的人很累!!
8 楼
xiaoruo331 [专家分:100] 发布于 2010-05-28 09:58:00
深圳华信群英科技有限公司,目前主要从事软件外包开发、高级软件人才定向输送等业务,面对日益严峻的大学生就业难和IT企业招聘难,自2006以来,与知名通信软件公司正式签订定向输送人才的合作协议,针对想进入软件行业的人员提供企业实训,实训课程采用“2+3”分段教学模式,分为2个月理论强化和3个月项目实训两个阶段,共计900学时。
企业订单委培,内训前签订就业安置协议,100%保证就业。实训结束之后,在华信群英科技及其战略合作伙伴从事通信软件研发工作。欢迎有意向者加QQ:649846168咨询。
9 楼
iamlms [专家分:40] 发布于 2010-05-28 15:18:00
还是用C++库吧,用cin>>输入,然后可以这样检测输入是否正确:
if( ! cin)
{
//输入错误(如把字母当数字)
我来回复