PAT B1031 查验身份证 学会断点调试! 字符串输入两个结果一样!循环自增看清楚要在哪里申明

//这题让我认识到断点调试的极大好处!!!棒极了!
//这一题调试了很久,后来改了gets为scanf("%s",str)才成功,用gets()时我也去除了换行符啊!目前仍然不知道怎么回事!  
//我靠,后来换成gets和getchar()在oj上又全部通过了!看来可能之前是别的原因造成的
//无论如何,下次用断点调试!加油! 
#include<stdio.h>
#include<string.h>
//#define LOCAL
int rate[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char change[11]={'1','0','X','9','8','7','6','5','4','3','2'};
int main(){
    #ifdef LOCAL
    freopen("B1031data.in","r",stdin);
    freopen("B1031data.out","w",stdout);
    #endif
    //这种题可以边读入边输出,因此不需要二维数组
    //关于验证是否是数字,可能要用是否在‘0’~‘9’之间了
    //从0开始存放到str中
    int n=0,count=0,last=0,i;//n<=100
    int number;
    bool flag=true;
    char str[20];//这个确实是字符型数组啊
    scanf("%d",&n);
    number=n;
    //getchar();//这一句很重要,不然就会吞掉一行数据
    
    while(n--){
        last=0;
        //gets(str);
        scanf("%s",str);
        flag=true;
        for(i=0;i<17;i++){//注意变量的局部性还是应该全局性。自增的不要总是放在循环中申明,看清外面要不要用到再确定在哪里申明
            if(!(str[i]>='0'&&str[i]<='9')) break;
            last+=(str[i]-'0')*rate[i];//一开始以为这里要除以100,结果发现并不要除
        }
         if(i<17){//应该=17才是对的
            flag=false;
            puts(str);
         }
         else{
             //如果前面的正确,再来验证最后一位
             if(str[17]!=change[last%11])
                 {
                     flag=false;
                     puts(str);
                 }
         }
         if(flag==true){
             count++;
         }
         /*else{
             puts(str);//默认输出后换行
         }*/
    }
    if(count==number){
        printf("All passed\n");    
    }


    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值