题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
1.scanf("%d.%d.%d.%d~%d.%d.%d.%d",ip,),这样可以把初值复位为非正常范围,然后判定该值有没有改变从而确认是否赋值成功,是否是正确的格式
2.掩码可以全部取反后加1,看是否只有一位数为1来判定是否是合法掩码
2.掩码可以全部取反后加1,看是否只有一位数为1来判定是否是合法掩码
#include<stdio.h>
int main(){unsigned char ipaddress_msak[8]={0},line[32]={0};
int i=0,j=0,k=0,m=0,start=0,end=0,len=0,cnt_A=0,cnt_B=0,cnt_C=0,cnt_D=0,cnt_E=0,cnt_pri=0,cnt_err=0,pre_h=1,err_sta=0;
while(scanf("%s ",line)!=EOF){
for(i=0,start=0;i<32;i++){
if(line[i]=='.'){
end=i-1;
len=end-start;
if((len>=0)&&(len<=2)){
for(j=0;j<=len;j++){
if((line[start+j]<='9')&&(line[start+j]>='0')){
ipaddress_msak[k]*=10;
ipaddress_msak[k]+=(line[start+j]-'0');
}else{
err_sta=1;
break;
}
}
}else{
err_sta=1;
break;
}
start=i+1;
k++;
}else if(line[i]=='~'){
end=i-1;
len=end-start;
if((len>=0)&&(len<=2)){
for(j=0;j<=len;j++){
if((line[start+j]<='9')&&(line[start+j]>='0')){
ipaddress_msak[k]*=10;
ipaddress_msak[k]+=(line[start+j]-'0');
}
else{
err_sta=1;
break;
}
}
}else{
err_sta=1;
break;
}
start=i+1;
k=4;
}else if(line[i]=='\0'){
end=i-1;
len=end-start;
if((len>=0)&&(len<=2)){
for(j=0;j<=len;j++){
if((line[start+j]<='9')&&(line[start+j]>='0')){
ipaddress_msak[k]*=10;
ipaddress_msak[k]+=(line[start+j]-'0');
}else{
err_sta=1;
break;
}
}
}
else{
err_sta=1;
break;
}
break;
}
}
if(err_sta==1){
cnt_err++;
}else{
for(k=0;k<4;k++){
if((ipaddress_msak[4+k]!=0xFF)&&(pre_h==1)){
for(m=7;m>=0;m--){
//printf("%X %X \n",(ipaddress_msak[4+k]>>m)&0x01,(ipaddress_msak[4+k]&(1<<m)));
if((((ipaddress_msak[4+k]>>m)&0x01)==0)&&(pre_h==1)){
pre_h=0;
}else if(((ipaddress_msak[4+k]&(1<<m))!=0)&&(pre_h==0)){
err_sta=1;
break;
}
}
if(err_sta==1){
break;
}
}else if((ipaddress_msak[4+k]!=0x00)&&(pre_h==0)){
err_sta=1;
break;
}
}
if((ipaddress_msak[4]==0)&&(ipaddress_msak[5]==0)&&(ipaddress_msak[6]==0)&&(ipaddress_msak[7]==0)){
err_sta=1;
}else if((ipaddress_msak[4]==0xFF)&&(ipaddress_msak[5]==0xFF)&&(ipaddress_msak[6]==0xFF)&&(ipaddress_msak[7]==0xFF)){
err_sta=1;
}
if((ipaddress_msak[0]>=1)&&(ipaddress_msak[0]<=126)){
if(err_sta==1){
cnt_err++;
}else{
cnt_A++;
if(ipaddress_msak[0]==10){
cnt_pri++;
}
}
}else if((ipaddress_msak[0]>=128)&&(ipaddress_msak[0]<=191)){
if(err_sta==1){
cnt_err++;
}else{
cnt_B++;
if((ipaddress_msak[0]==172)&&(ipaddress_msak[1]>=16)&&(ipaddress_msak[1]<=31)){
cnt_pri++;
}
}
}else if((ipaddress_msak[0]>=192)&&(ipaddress_msak[0]<=223)){
if(err_sta==1){
cnt_err++;
}else{
cnt_C++;
if((ipaddress_msak[0]==192)&&(ipaddress_msak[1]==168)){
cnt_pri++;
}
}
}else if((ipaddress_msak[0]>=224)&&(ipaddress_msak[0]<=239)){
if(err_sta==1){
cnt_err++;
}else{
cnt_D++;
}
}else if((ipaddress_msak[0]>=240)&&(ipaddress_msak[0]<=255)){
if(err_sta==1){
cnt_err++;
}else{
cnt_E++;
}
}else{
//cnt_err++;
}
err_sta=0;
memset(ipaddress_msak,0,8);
k=0;
pre_h=1;
}
}
printf("%d %d %d %d %d %d %d",cnt_A,cnt_B,cnt_C,cnt_D,cnt_E,cnt_err,cnt_pri);
return 0;
}