前言
NWAFU Content1102 AU
注:代码中循坏外的条件结构是对注释部分的视觉优化 2023.11.29注
一、题目描述
某城市电话号码包括地区码、前缀、有效号码三部分组成,其中地区码是0-4位数字;前缀是以非0开头的3位数字,有效号码是4位数字,各部分之间用减号(-)分隔,地区码为空时地区码与前缀之间不包含分隔符。请编写函数检测输入号码num的有效性,若输入号码符合上述规定返回0,否则返回1。函数原型定义如下:
int CheckPhoneNum(char * num);
二、设计步骤
既然对号码各部分有要求,那就用原始思路,我们对各个部分分别检查是否满足条件。
因此我们定义缓存二维数组temp,将原字符串num分开存储,而后分别判断temp各个部分是否满足条件,若满足则对ret赋值0(刚开始看错了题,以为1是满足0是不满足,给我一顿好debug)否则返回初值1。
CheckDigit函数不能用strlen函数代替,我们在CheckPhoneNum中对不合法输入没有加以限制,而放在CheckDigit函数中,避免CheckPhoneNum函数过于臃肿。
#include<stdio.h>
#include<stdlib.h>
#define _CRT_SECURE_NO_WORNINGS
#define len 14
int CheckDigit(char *); //字符串有效数字位数判断函数
int CheckPhoneNum(char *);
int CheckPhoneNum(char * num)
{
int i,h = 0,j = 0,ret = 1; //i用于遍历num,h遍历缓存数组,j统计号码分几部分
char temp[3][6] = {'\0'}; //将num分开存储
for(i = 0;i < len;i++){
if(*(num+i) == '\0')
break;
if(*(num+i) != '-'){ //拷贝
temp[j][h] = *(num+i);
h++;
}
else{ //读到分隔时在下一个数组中存储
j++;
h = 0;
continue;
}
}
if(temp[j-1][0] != '0' && CheckDigit(temp[j-1]) == 3 && CheckDigit(temp[j]) == 4){
if(j == 1 || (j == 2 && CheckDigit(temp[0]) > 0 && CheckDigit(temp[0]) <= 4))
ret = 0;
}
//if(j == 1){ //当num没有地区码
// if(temp[0][0] != '0' && CheckDigit(temp[0]) == 3 && CheckDigit(temp[1]) == 4)
// ret = 0;
//}
//else if(j == 2){ //当num有地区码
// if(CheckDigit(temp[0]) > 0 && temp[1][0] != '0' && CheckDigit(temp[0]) <= 4 && CheckDigit(temp[1]) == 3 && CheckDigit(temp[2]) == 4)
// ret = 0;
//}
return ret;
}
int CheckDigit(char *test)
{
int i = 0;
while(*(test+i) >= '0' && *(test+i) <= '9')
i++;
return i;
}
小白的原始思路,有佬的修改意见请指导!
总结
EOF