P7911 网络连接 评论及c++题解
P7911 网络连接
1.原题链接
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;
}

浙公网安备 33010602011771号