华为招聘机试整理4:手机号码合法性判断
题目:手机号码合法性判断
题目描述:
我国大陆运营商的手机号码标准格式为:国家码+手机号码,例如:8613912345678。特点如下:
1、 长度13位;
2、 以86的国家码打头;
3、 手机号码的每一位都是数字。
请实现手机号码合法性判断的函数要求:
1) 如果手机号码合法,返回0;
2) 如果手机号码长度不合法,返回1
3) 如果手机号码中包含非数字的字符,返回2;
4) 如果手机号码不是以86打头的,返回3;
【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断。
要求实现函数:
int verifyMsisdn(char inMsisdn)
【输入】 char inMsisdn,表示输入的手机号码字符串。
【输出】 无
【返回】 判断的结果,类型为int。
示例
输入: inMsisdn = “869123456789“
输出: 无
返回: 1
输入: inMsisdn = “8813912345678“
输出: 无
返回: 3
输入: inMsisdn = “861391234567“
输出: 无
返回: 0
题目分析:
这道题也没有什么单独,就是要你会用if,for语句。
特殊的在于,手机合法的时候返回0,常规下我们都是手机号码非法输入时返回0,所以我们要考虑手机非法输入的时候,怎么办?我们想到一个assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义: #include <assert.h>
void assert( int expression );
还有需要判断是否为数字,用#include<ctype.h>中的isdigit来判断
===========================================================================
参考代码:
//手机号码合法性判断.cpp
//2014.7.9 hepanhui
#include <iostream>
#include <string>
#include <ctype.h>
#include <assert.h>
const int maxn = 1000;
using namespace std;
int verifyMsisdn(char *inMsisdn)
{
assert(inMsisdn != NULL);
int len = strlen(inMsisdn);
if(len != 13)
return 1;
for(int i = 0; i < len; i++)
{
if(!isdigit(inMsisdn[i]))
return 2;
}
if(inMsisdn[0] != '8' || inMsisdn[1] != '6')
return 3;
return 0;
}
int main()
{
char str[maxn];
cin >> str;
cout << verifyMsisdn(str) << endl;
return 0;
}
调试过程中易犯的错误:
非法输入的时候千万不能写成inMsisdn = NULL,这样会报错,说inMsisdn指向ox00000000无效