A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 超の 中级黑马   /  2015-10-3 16:44  /  1346 人查看  /  4 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

        中华人民共和国公民身份证号码组成规则是前4位是代表省份和地区(例如4201代表湖北省武汉市),最后一位代表性别(1或3代表男性)。编写一个程序,通过身份证号码判断某人是否是武汉人以及其性别。
        char c[30];
        printf("请输入你的身份证号\n");
        gets(c);
// 把C中的字符串转换为OC
        NSString *str =[NSString stringWithUTF8String : c];
//判断前缀
        if ([str hasPrefix:@"4201"]) {
               
                NSLog(@"湖北省人");
               
        }else NSLog(@"bushi ");
        //判断后缀
        if ([str hasSuffix:@"1"]||[str characterAtIndex:str.length-1]=='3'){//获取最后一个字符
                NSLog(@"男性");
        }else NSLog(@"女性");

4 个回复

倒序浏览
有若干个bug
第一,使用gets方法会在输出窗提示警告字样,可以用fgets来解决问题,而且gets并不安全,可以超出输入长度,如图



第二,只要满足开头和结尾判定条件,即便是英文,也能通过验证
如图



第三,由于没有设定相关的输入判断方法,会导致不论输入任何字符,只要不满足判定条件,均被判定为女性,非湖北省
如图



修改建议:
设定纠错方法,当输入超过16位长度的时候提醒超出长度,并且判定输入内容中是否存在非法字符,即除去数字之外的字符,16位身份证号码不包含最后一位校验码X,所以不会有其他字符,另外就是我记得题目中说“1”和“3”代表男性,当然没说就算了- -以及判定条件建议不要用前缀判断,用range取出之后compare一下
以上
回复 使用道具 举报
我了个去,学习了
回复 使用道具 举报
这题可以。自己也动手写写
回复 使用道具 举报
RIDP 发表于 2015-10-3 16:57
有若干个bug
第一,使用gets方法会在输出窗提示警告字样,可以用fgets来解决问题,而且gets并不安全,可以 ...

学习了,确实没有做判断。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马