题解
2024-09-29 10:41:16
发布于:浙江
我们需要一个公式
sscanf(s, "%lld.%lld.%lld.%lld:%lld", &a, &b, &c, &d, &port)
表示从 s 中读入 a,忽略下一个 .,读入 b,忽略下一个。以此类推。其返回值是成功读取的元素个数。因此如果返回值不是 55 一定不合法。如果几个值不满足题目要求也不合法。
然后考虑处理前导 0 和后面是否多出来一些内容。但是我们可以反过来,用得到的的数拼出合法的地址,然后和原串比较一下是否完全相同。如果没有前导 0 且后面没有多余内容,两者应该完全相同。
另外,如果你使用的是C++ 14标准,那么你可使用regex正则表达式,就像这样:
regex r("(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]):(\d|[1-9]\d{1,3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])");
虽然很长,但其实并不难理解,就是ip地址的格式串,当然我们需要用正常的思路,也是需要写一个函数的。
大概就是这样,应该很好理解:
复制代码
bool check(char s[]){
int a=-1,b=-1,c=-1,d=-1,e=-1;
int t=sscanf(s,"%d.%d.%d.%d:%d",&a,&b,&c,&d,&e);
if(t!=5) return 0;
if(a<0||a>255) return 0;
if(b<0||b>255) return 0;
if(c<0||c>255) return 0;
if(d<0||d>255) return 0;
if(e<0||e>65535) return 0;
char s2[35];
sprintf(s2,"%d.%d.%d.%d:%d",a,b,c,d,e);
int lens=strlen(s);
bool ok=0;
for(int i=0;i<lens;i++){
if(s[i]==s2[i]) ok=1;
else{
ok=0;
break;
}
}
return ok;
}
复制代码
代码
复制代码
#include<bits/stdc++.h>
using namespace std;
map<string,int> vis;
int n;
bool check(char s[]){
int a=-1,b=-1,c=-1,d=-1,e=-1;
int t=sscanf(s,"%d.%d.%d.%d:%d",&a,&b,&c,&d,&e);
if(t!=5) return 0;
if(a<0||a>255) return 0;
if(b<0||b>255) return 0;
if(c<0||c>255) return 0;
if(d<0||d>255) return 0;
if(e<0||e>65535) return 0;
char s2[35];
sprintf(s2,"%d.%d.%d.%d:%d",a,b,c,d,e);
int lens=strlen(s);
bool ok=0;
for(int i=0;i<lens;i++){
if(s[i]s2[i]) ok=1;
else{
ok=0;
break;
}
}
return ok;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
char op[1005],ad[1005];
cin>>op>>ad;
string t(ad);
if(op[0]'S'){
if(!check(ad)) cout<<"ERR"<<endl;
else if(vis.count(t)!=0){
cout<<"FAIL"<<endl;
}
else{
cout<<"OK"<<endl;
vis[t]=i;
}
}
else{
if(!check(ad)){
cout<<"ERR"<<endl;
}
else if(vis.count(t)==0){
cout<<"FAIL"<<endl;
}
else{
cout<<vis[ad]<<endl;
}
}
}
}
这里空空如也
有帮助,赞一个