城市电话号码

前言

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
#include
#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

你可能感兴趣的:(学习方法,c语言)