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