这道题真的有点恶心,一道大模拟!!
可以看到模拟题的题意还是非常长的,所以这时候一定要看清题意再去动手做题,不然有可能某个模块写到一半发现下面的要求跟你写的有点不对,改的麻烦是一回事,搞心态才是重点!!
代码思路:
1、模拟题的原则就是题目让我干什么我就干什么就完了!!
关键是要把事情干的又好又漂亮!!
2、这道题的重点是判断是否存在不合法情况,如果有那么处理是重点!!
bool func(char id[]){
int a = -1,b = -1,c = -1,d = -1,e = -1;
int t = sscanf(id,"%d.%d.%d.%d:%d",&a,&b,&c,&d,&e);
if(t!=5 || a < 0 || a >255 || b < 0 || b > 255 || c < 0 || c > 255 || d < 0 || d > 255 || e < 0 || e > 65535) return false;
char id_c[1000];
sprintf(id_c,"%d.%d.%d.%d:%d",a,b,c,d,e);
for(int i = 1; i < strlen(id); i++){
if(id[i] != id_c[i]) return 0;
}
return 1;
}
处理模块如上:(介绍几个方法)
1、sscanf(char[],string格式化字符串,保存的变量.....);
这个函数会返回读入了几个合法变量;
比如int t = sscanf(“20140523”,“%4d%2d%2d”,&y,&m,&d);
此时三个变量都合法那么t = 3;
int t = sscanf(“2014”,“%4d%2d%2d”,&y,&m,&d);
那么此时只有y会读入,t = 1;
2、sprintf(char[],string格式化字符串,a,b,c,d,e....);
sprintf 都使用格式化字符串来指定串的格式,在格式串内部使用一些以"%"开头的格式说明符(format specifications)来占据一个位置,在后边的变参列表中提供相应的变量,最终函数就会用相应位置的变量来替代那个说明符,产生一个调用者想要的字符串。
简单来说就是把几个数据按照某个格式拼接到一个字符串里面
sprintf(id_c,"%d.%d.%d.%d:%d",a,b,c,d,e);
那么拼接出来的字符数组id_c就是192.168.1.1:8080(举个例子,实际数据根据a,b,c,d,e而改变)
3、比较主要是为了看字符串有没有多余不合法位数;
剩下的一个重点就是存储合法id:
这里我用的是map,比较好用么,不在多说;id为map的key,而计算机编号为value,map.conut(key)判断是否存在就好了
AC代码:
#include<bits/stdc++.h>
using namespace std;
map<string,int> m;
bool func(char id[]){
int a = -1,b = -1,c = -1,d = -1,e = -1;
int t = sscanf(id,"%d.%d.%d.%d:%d",&a,&b,&c,&d,&e);
if(t!=5 || a < 0 || a >255 || b < 0 || b > 255 || c < 0 || c > 255 || d < 0 || d > 255 || e < 0 || e > 65535) return false;
char id_c[1000];
sprintf(id_c,"%d.%d.%d.%d:%d",a,b,c,d,e);
for(int i = 1; i < strlen(id); i++){
if(id[i] != id_c[i]) return 0;
}
return 1;
}
int main(){
int n; cin >> n;
for(int i = 1; i <= n; i++){
string s;
char id[2000];
cin >> s >> id;
if(!func(id)){
cout << "ERR" << endl;
continue;
}
string t(id);
if(s == "Server"){
if(m.count(t) == 0){
cout << "OK" << endl;
m[t] = i;
}
else cout << "FAIL" << endl;
}
if(s == "Client"){
if(m.count(t) != 0) cout << m[t] << endl;
else cout << "FAIL" << endl;
}
}
return 0;
}