题解 | #识别有效的IP地址和掩码并进行分类统计# 18
识别有效的IP地址和掩码并进行分类统计
https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
#include <stdio.h>
#define size 15
#include <string.h>
int numip[7]={0}; //储存输出值
int istrueip(char *ip,int voild){ //这里ip判断的很细
int num[5]={0,-1,-1,-1,-1},k=1,temp=0,flag=0,len=strlen(ip);
for(int i=0;i<len;i++){ //.,四个整数足够
if(ip[i]=='.'){
num[0]++;
}
}
if(num[0]!=3){
return 5;
}
for(int i=0;i<len;i++){
if(i<len-1 && ip[i]==0 && ip[i+1]==0){ //整数01.2.2.2,判错误,01错了
return 5;
}
temp=0,flag=0;
while('0'<=ip[i] && ip[i]<='9' && i<len){ //记这个整数
temp=temp*10+(ip[i]-'0');
i++;
flag=1; //flag标记有整数
}
if(flag==1){num[k]=temp;}
if(num[k]>255||num[k]<0){ //超出255错误,初始-1,没变错误
return 5;
}
k++;
}
if((voild)&&(num[1]==10 || (num[1]==172&&num[2]>=16&&num[2]<=31) || (num[1]==192&&num[2]==168))){ //参数voild ,表示私有变不变,因为0和172开头的特性
numip[6]++;
}
if(num[1]>=1&&num[1]<=126){ //下面是五类的分类
return 0;
}
if(num[1]>=128 && num[1]<=191){ return 1;}
if(num[1]>=192 &&num[1]<=223){return 2;}
if(num[1]>=224 &&num[1]<=239){return 3;}
if(num[1]>=240 &&num[1]<=255){return 4;}
return 7;
}
int istrueipx(char*ipx){
int num[5]={0,-1,-1,-1,-1},k=1,temp=0,flag=0,len=strlen(ipx);
int is1[8]={0,128,192,224,240,248,252,254}; //这个是前一后0的所有数
for(int i=0;i<len;i++){
if(ipx[i]=='.'){ //和ip一样
num[0]++;
}
}
if(num[0]!=3){
return 5;
}
for(int i=0;i<len;i++){
temp=0;
while('0'<=ipx[i] && ipx[i]<='9' && i<len){
temp=temp*10+(ipx[i]-'0');
i++;
}
num[k]=temp;
k++;
} //掩码四个数存入
for(int i=1;i<5;i++){
if(num[i]!=255){ //第一个不为255的数,
for(int j=0;j<8;j++){ //判断前一后0是不是
if(num[i]!=is1[j]){
continue;
}
flag=1; //flag标志 是
break;
}
if(flag==0){return 5;} //不是就表示错误掩码
for(int j=i+1;j<5;j++){ //是的话,后0判断注意这里i+1,没有+1第8个示例过不去
if(num[j]!=0){return 5;}
}
}
}
if(num[1]==255&&num[2]==255&&num[3]==255&&num[4]==255){ //两个特例错误
return 5;
}
if(num[1]==0&&num[2]==0&&num[3]==0&&num[4]==0){
return 5;
}
return 7;
}
int main() {
char input[2*size+1]={'\0'},ip[size]={'\0'},ipx[size]={'\0'};
int temp=0;
while (scanf("%s", input) != EOF) { // 注意 while 处理多个 case //输入
// 64 位输出请用 printf("%lld") to
for(int i=0;i<strlen(input);i++){ //找到~
if(input[i]=='~'){
strncpy(ip,input,i); //前面的给ip
strcpy(ipx,input+i+1); //后面的给ipx,掩码
break;
}
}
temp=istrueipx(ipx); //先判断掩码
if(temp==7){
temp=istrueip(ip,1); //掩码正确,归类ip
if(temp<7){
numip[temp]++;
}
}
else{ //掩码不正确
temp=istrueip(ip,0); //参数0,不让他私有地址判断
if(temp!=7)
numip[5]++; //ip返回的7是0...和127.....,,非7就是掩码错误,错误+1
}
strncpy(ip,"",strlen(ip)); //字符串要重置
strncpy(ipx,"",strlen(ipx));
}
for(int i=0;i<7;i++){ //0是A,1是B,2是C,按顺序
printf("%d ",numip[i]);
}
return 0;
}

巨人网络公司福利 91人发布
查看10道真题和解析