2021年CSP-J-T3-网络连接(network)
题目:
示例2
输入
10
Server 192.168.1.1:80
Client 192.168.1.1:80
Client 192.168.1.1:8080
Server 192.168.1.1:80
Server 192.168.1.1:8080
Server 192.168.1.999:0
Client 192.168.1.1.8080
Client 192.168.1.1:8080
Client 192.168.1.1:80
Client 192.168.1.999:0
输出
OK
1
FAIL
FAIL
OK
ERR
ERR
5
1
ERR
思路
题目思路比较简单,复杂的主要是数据的校验,字符如何判断~~(之前没咋写,很痛苦的自己想了很久,效果不大,服了)~~
- 由于连接成功需要服务器编号,所以需要记录服务器的地址和编号,可以考虑结构体,但是结构体就需要每次都要遍历,不太方便,数据量大也可能会超时。所以考虑map来存数据,因为map的建必须唯一,所以没必要所有的服务器都存,只需要把不重复的数据放入map即可。
- 判断是否符合规范,是否有前导0,是否数据在0-255 最后一个数据<0-999999 ,这部分可以用sscanf来处理数据,也可以用stringstream处理
- 服务机判断是否重复,重复则为fail,
- 客服机连接成功为电脑号数,没连上则为falil
代码
#include<bits/stdc++.h>
using namespace std;
//判断是否符合要求
bool check(string s0){
long long a,b,c,d,e;
//解析得到数字部分 也可以直接用stringstream来处理
// stringstream t(s0);
//char m;
//stringstream t(s0);
// t>>a >>m>> b>>m>> c >>m>> d>>m>>e;
sscanf(s0.c_str(), "%lld.%lld.%lld.%lld:%lld", &a,&b,&c,&d,&e);
if (a < 0 || a > 255 || b < 0 || b > 255 || c < 0 || c > 255 || d < 0 || d > 255 || e < 0 || e > 65535)
return false;
//解析符号
stringstream t;
t << a << '.' << b << '.' << c << '.' << d << ':' << e;
return t.str() == s0;
}
int main(){
int k;
string s,s1,s2,s3;
map <string,int> m;
cin>>k;
for(int i=1;i<=k;i++){
cin>>s1>>s2;
//先判断
if(check(s2)==false){
cout<<"ERR"<<endl;
continue;
}
if(s1=="Server"){
if(m.count(s2)!=0){ //服务器重复
cout<<"FAIL"<<endl;
}else{
m[s2]=i;//插入不重复的服务器就行了
cout<<"OK"<<endl;
}
}else{
if(m.count(s2)==0){ //服务器不存在
cout<<"FAIL"<<endl;
}else{
cout<<m[s2]<<endl;
}
}
}
//检查map数据
// map<string,int>::iterator it;
// for(it=m.begin();it!=m.end();it++){
// cout<<it->first<<" "<<it->second<<endl;
// }
return 0;
}
**
补充sscanf
sscanf
- 在C语言中,sscanf函数是一个强大的字符串格式化函数,用于从字符串中按照指定的格式解析数据。
- 它类似于scanf函数,但不是从标准输入流读取数据,而是从字符串中提取数据。
- sscanf函数可以根据格式字符串指定的规则,将字符串中的数据提取出来并存储到对应的变量中。
- sscanf函数只会从字符串中解析数据,不会对字符串进行修改。
sscanf函数的语法如下:
int sscanf(const char* str, const char* format, ,,,);
str:要解析的输入字符串。
format:格式字符串,指定了要匹配的格式规则。
...:可变参数列表,用于接收解析后的数据。!!!必须是地址
解析简单的数据类型
读取字符串时由于%s格式符在遇到空格、制表符或换行符时才停止读取,
c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同.是一个临时指针,不能直接用来赋值
这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。
//将字符串s解析为整数,并将结果存储在变量num中。 strinf s='42'; int num; sscanf("42", "%d", &num); string buf; sscanf("Hello World", "%s", &buf); printf("%s",&buf); //解析字符串 string buf,b="Hello World"; sscanf(b.c_str(), "%s", &buf); printf("%s",&buf); //使用 string s="1234"; strcpy(c,s.c_str());
解析多个数据
int a, b; sscanf("10 20", "%d %d", &a, &b);
返回值
sscanf函数返回成功解析的数据项的个数。如果解析失败或没有匹配的数据项,则返回0。
**
题目地址:牛客题目
参考文章:stringstream原文链接