标题:刁难人的题目(高手专题),如何避免用户输入的是字母时的程序崩溃
只看楼主
大头虾的儿子
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2012-10-4
结帖率:50%
已结贴  问题点数:20 回复次数:7 
刁难人的题目(高手专题),如何避免用户输入的是字母时的程序崩溃
//如果按要求输入0到16数字,程序完全没问题,但是如果程序是给一般用户用,他们错误的输入字母时我们的程序就会崩溃,如何改进程序,使得输入的程序提醒用户输入错误,请重新输入
#include "stdafx.h"
#include<ctype.h>
#include<stdio.h>
#include<math.h>
int main()
{
    int i,n,change[16]={0};
    printf("如果输入的数据不够16个,请在输入最后一个数据后输入16\n");
    for(i=0;i<16;i++)
    {
        printf("请输入change[%d]",i);
    //    if(change[i]>'a'&& change[i]<'z'||change[i]>'A'&& change[i]<'Z')
            
        scanf(" %d",&change[i]);
   
        
        if(change[i]>16||change[i]<0||change[i]>(int)'a'&& change[i]<(int)'z'||change[i]>(int)'A'&& change[i]<(int)'Z')
        {
            printf("输入的数据有误,请重新输入\n");
            --i;
        }
   
        if(change[i]==16)
        {
            break;
        }
    }
    for(n=0;n<i;n++)
    {
        printf("输入的数字为 %d\n",change[n]);
    }
    return 0;
}
搜索更多相关主题的帖子: 如何 include change 
2012-10-05 14:24
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
得分:5 
change[i]>(int)'a'&& change[i]<(int)'z'||change[i]>(int)'A'&& change[i]<(int)'Z'
这些判断条件是没用的,如果输入的是非数字,那么scanf并不会住change[i]里面写东西。
解决办法是判断scanf的返回值,它的返回值是成功输入的个数。比如scanf(" %d",&change[i]),如果成功输入了会返回1,返回0,就代表输入有误,返回EOF(一般是-1)说明遇到文件尾。
如果返回了0,你可以提示用户输入的东西无效,而且之后你要清空输入缓冲区的残留,就是用户输入的那些错误字符,不然就会卡在这里。
参考代码:
char ch;
while ((ch = getchar()) != '\n' && ch != EOF) ;
这段代码可以用来清除缓冲区里的残留。

[ 本帖最后由 lz1091914999 于 2012-10-5 16:51 编辑 ]

My life is brilliant
2012-10-05 15:04
xtjopt
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:89
专家分:168
注 册:2012-9-12
得分:5 
哎 新手 学到了一点 看不懂 还是要多学学基础。。。
2012-10-05 15:41
青春无限
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江苏
等 级:贵宾
威 望:24
帖 子:3450
专家分:19340
注 册:2012-3-31
得分:5 
学习

学 会看代码…学习写程序…学会搞开发…我的目标!呵呵是不是说大话啊!!一切皆可能
2012-10-05 17:33
大头虾的儿子
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2012-10-4
得分:0 
谢谢二楼的赐教,问题解决了,不过我也没看懂那段清除缓冲区的代码.....求解释。。能不能解释下缓冲区的作用,缓冲区存放的数据能不能在为被清除的情况下用另外一些数据将其覆盖。(发现你提供的清除缓冲区的代码的位置不一样,对程序的运行有影响,比如在if(change[i]>16||change[i]<0)
前面放上你提供的代码就会出现,如果输入大于16的值时无法检测出输入的值大于16的情况
for(i=0;i<16;i++)
    {
        printf("请输入change[%d]",i);

            
        treturn=scanf(" %d",&change[i]);
        if(treturn==0)
        {
            printf("用户输入错误,请重新输入\n");
            --i;
        }
        
        if(change[i]>16||change[i]<0)
        {
            printf("输入数据范围不对,请重新输入\n");
            --i;
        }
        while ((ch = getchar()) != '\n' && ch != EOF)
        if(change[i]==16)
        {
            break;
        }
    }
2012-10-05 17:37
大头虾的儿子
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2012-10-4
得分:0 
额,,刚刚发的源程序的位置有点错正确的应该是下面这个
#include "stdafx.h"
#include<stdio.h>
int main()
{
    int i,n,change[16]={0},treturn;
    char ch;
    printf("如果输入的数据不够16个,请在输入最后一个数据后输入16\n");
    for(i=0;i<16;i++)
    {
        printf("请输入change[%d]",i);

            
        treturn=scanf(" %d",&change[i]);
        if(treturn==0)
        {
            printf("用户输入错误,请重新输入\n");
            --i;
        }
        
        if(change[i]>16||change[i]<0)
        {
            printf("输入数据范围不对,请重新输入\n");
            --i;
        }
        
        if(change[i]==16)
        {
            break;
        }
        while ((ch = getchar()) != '\n' && ch != EOF)
            ;
    }
    for(n=0;n<i;n++)
    {
        printf("输入的数字为 %d\n",change[n]);
    }
    return 0;
}
2012-10-05 17:46
海莲
Rank: 1
等 级:新手上路
帖 子:19
专家分:5
注 册:2012-9-27
得分:5 
我还要努力啊
2012-10-05 19:33



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-382563-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015668 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved