P7911 网络连接 评论及c++题解

P7911 网络连接

1.原题链接

root

2.评论

下位黄的水平
前置知识:sscanf()函数,sprintf()函数,map<>
当然,不会sscanf()和sprintf()也有解法,详见解法1

3.题解

解法1

#include<bits/stdc++.h>
using namespace std;
int n;
map<string,int> server;
bool check(string ad){
	int k1=0,k2=0,k3=0;
	long long num=0;
	for(int i=0;i<ad.size();i++){
		if((ad[i]>='0' && ad[i]<='9')&&(i==0 || ad[i-1]=='.' || ad[i-1]==':')) k3++;
		if(ad[i]=='.' || ad[i]==':'){
			if(ad[i]=='.') k1++;
			if(ad[i]==':') k2++;
			if(k1<3 && k2!=0) return false;
			if(k3==0) return false;         // 判断符号
			if(0<=num && num<=255){
				num=0;
				continue;
			}
			else{
				return false;
			}
		}
		else if(ad[i]<'0' && ad[i]>'9'){
			return false;                   //非数字
		}
		else if(i && !num && ad[i-1]=='0'){
			return false;                   //前置'0'
		}
		num=num*10+ad[i]-'0';
	}
	if(k1!=3 || k2!=1 || k3!=5){
		return false;
	}
	if(0<=num&& num<=65535){
		return true;
	}
	else{
		return false;
	}
}
int main(){                                             //主程序 没什么好说的
	cin>>n;
	string ad,op;
	for(int i=1;i<=n;i++){
		cin>>ad>>op;
		if(!check(op)){
			cout<<"ERR"<<endl;
			continue;
		}
		if(ad=="Server"){
			if(server[op]==0){
				server[op]=i;
				cout<<"OK"<<endl;
			}
			else{
				cout<<"FAIL"<<endl;
			}
		}
		else{
			if(server[op]>0) cout<<server[op]<<endl;
			else{
				cout<<"FAIL"<<endl;
			}
		}
	}
	return 0;
}

比较麻烦,sscanf()函数被调换成字符串的字符

解法2

#include<bits/stdc++.h>
using namespace std;
int n;
map<string,int> server;
bool check(string ip){
	int t[6]={0,-1,-1,-1,-1,-1};
	int cnt=sscanf(ip.c_str(),"%d.%d.%d.%d:%d",&t[1],&t[2],&t[3],&t[4],&t[5]); //取出数字
	if(cnt!=5) return 0;                                                       //长度不合法
	for(int i=1;i<=4;i++){
		if(t[i]<0 || t[i]>255) return 0;                                   //ip大小不合法
	}
	if(t[5]<0 || t[5]>65536) return 0;                                         //ip后缀不合法
	char ch[50];
	sprintf(ch,"%d.%d.%d.%d:%d",t[1],t[2],t[3],t[4],t[5]);                     //组合
	if(ip!=string(ch)) return 0;                                               //判断前导0
	return 1;
}
int main(){                                                                        //主程序
	cin>>n;
	string s,t;
	for(int i=1;i<=n;i++){
		cin>>s>>t;
		if(!check(t)){
			cout<<"ERR"<<endl;
			continue;
		}
		if(s=="Server"){
			if(server[t]==0){
				server[t]=i;
				cout<<"OK"<<endl;
			}
			else{
				cout<<"FAIL"<<endl;
			}
		}
		else{
			if(server[t]>0){
				cout<<server[t]<<endl;
			}
			else{
				cout<<"FAIL";
			}
		}
	}
	return 0;
} 
posted @ 2022-10-25 21:59  織田信長  阅读(56)  评论(0)    收藏  举报
Title