题目描述
某城市电话号码包括地区码、前缀、有效号码三部分组成,其中地区码是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;
}
标签:P1491,西农,num,OJ,号码,int,char,code,前缀
From: https://www.cnblogs.com/orzmiku/p/17644163.html