西农OJ P1491 城市电话号码

发布时间 2023-08-20 16:17:14作者: OrzMiku

题目描述

某城市电话号码包括地区码、前缀、有效号码三部分组成,其中地区码是0-4位数字;前缀是以非0开头的3位数字,有效号码是4位数字,各部分之间用减号(-)分隔,地区码为空时地区码与前缀之间不包含分隔符。请编写函数检测输入号码num的有效性,若输入号码符合上述规定返回0,否则返回1。函数

原型定义如下:

int CheckPhoneNum(char * num);

输入

地区码-前缀-有效号码

地区码是0-4位数字,地区码为空时地区码与前缀之间不包含分隔符

前缀是以非0开头的3位数字

有效号码是4位数字

题解

思路

由题可知,号码有两种类型. 有地区码无地区码. 区别方式是判断有几个分隔符.

先判断号码类型,再判断是否合法.

代码

#include<stdio.h>

int numType(char *num); // 判断号码类型
int code1(char *code); // 判断地区码是否合法
int code2(char *code); // 判断前缀是否合法
int code3(char *code); // 判断有效号码是否合法

int CheckPhoneNum(char *num);

int main(){
    char phoneNumber[100];
    scanf("%s",phoneNumber);
    printf("%d\n",CheckPhoneNum(phoneNumber));
    return 0;
}

// 判断号码类型
int numType(char *num){
    int cnt = 0;
    int i = 0;
    while(1){
        if(num[i++]=='-'){
            cnt++;
        }
        if(num[i]=='\0'){
            break;
        }
    }
    if(cnt==2){
        return 1;
    }else{
        return 0;
    }
}

// 判断地区码是否合法
int code1(char *code){
    int cnt = 0,i = 0;
    while(1){
        if(code[i] >= '0' && code[i] <= '9'){
            i++;
            cnt++;
        }else{
            return 0;
        }
        if(code[i] == '\0'){
            break;
        }
    }
    if(cnt <= 4){
        return 1;
    }else{
        return 0;
    }
}

// 判断前缀是否合法
int code2(char *code){
    if(code[0]=='0') return 0;
    int cnt = 0,i = 0;
    while(1){
        if(code[i] >= '0' && code[i] <= '9'){
            i++;
            cnt++;
        }else{
            return 0;
        }
        if(code[i] == '\0'){
            break;
        }
    }
    if(cnt == 3){
        return 1;
    }else{
        return 0;
    }
}

// 判断有效号码是否合法
int code3(char *code){
    int cnt = 0,i = 0;
    while(1){
        if(code[i] >= '0' && code[i] <= '9'){
            i++;
            cnt++;
        }else{
            return 0;
        }
        if(code[i] == '\0'){
            break;
        }
    }
    if(cnt == 4){
        return 1;
    }else{
        return 0;
    }
}

int CheckPhoneNum(char *num){
    int res = 0; // 结果
    int i = 0; // num位置指针
    int j = 0; // code位置指针
    char code[100]; // 存放代码
    if(numType(num) == 1){ // 如果有地区码
        while(1){ // 获取地区码
            if(num[i] == '-' || num[i] == '\0'){
                i++;
                code[j++] = '\0'; // code截止
                j = 0; // 归位code位置指针
                break;
            }
            code[j++] = num[i++];
        }
        res = code1(code);
        if(res == 0){
            return 1;
        }
    }
    while(1){ // 获取前缀
        if(num[i] == '-' || num[i] == '\0'){
            i++;
            code[j++] = '\0'; // code截止
            j = 0; // 归位code位置指针
            break;
        }
        code[j++] = num[i++];
    }
    res = code2(code);
    if(res == 0){
        return 1;
    }
    while(1){ // 获取有效号码
        if(num[i] == '-' || num[i] == '\0'){
            i++;
            code[j++] = '\0'; // code截止
            j = 0; // 归位code位置指针
            break;
        }
        code[j++] = num[i++];
    }
    res = code3(code);
    if(res == 0){
        return 1;
    }
    return 0;
}