回 帖 发 新 帖 刷新版面

主题:怎么样解决这个错误

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!
````
最后崩溃。

应该怎样解决这个问题呢?

回复列表 (共9个回复)

沙发

在 scanf("%d",&pn);后面加上
fflush(stdin)
或者:
flushall() 来清空缓冲区看看

板凳

在scanf()中你要求输入的是%d型,但如果输入的是字符的话,编译器可能会把字符当作一个变量对待,pn指向输入的变量的地址,而输入的这个变量又没有分配空间,所以会出现段错误。我对指针掌握的不太好,觉得是这里的问题。你可以把%d换成%c,输入字符(即短整型),这样问题可以避免.

3 楼

[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 楼

fflush(stdin);其实是个未定义行为,语意上看是强制刷新标准输入流(输入缓冲区)。flushall则是强制刷新所有缓冲区

5 楼

那怎么改

6 楼

4楼正解,详细内容,请Google一哈

7 楼

把你全部代码都发上来吧,你给的这些都衔接不上,看的人很累!!

8 楼


深圳华信群英科技有限公司,目前主要从事软件外包开发、高级软件人才定向输送等业务,面对日益严峻的大学生就业难和IT企业招聘难,自2006以来,与知名通信软件公司正式签订定向输送人才的合作协议,针对想进入软件行业的人员提供企业实训,实训课程采用“2+3”分段教学模式,分为2个月理论强化和3个月项目实训两个阶段,共计900学时。
企业订单委培,内训前签订就业安置协议,100%保证就业。实训结束之后,在华信群英科技及其战略合作伙伴从事通信软件研发工作。欢迎有意向者加QQ:649846168咨询。

9 楼


还是用C++库吧,用cin>>输入,然后可以这样检测输入是否正确:

if( ! cin)
{
    //输入错误(如把字母当数字)
    

我来回复

您尚未登录,请登录后再回复。点此登录或注册