2021年CSP-J-T3-网络连接(network)

发布于:2024-06-13 ⋅ 阅读:(85) ⋅ 点赞:(0)

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:格式字符串,指定了要匹配的格式规则。
...:可变参数列表,用于接收解析后的数据。!!!必须是地址

  1. 解析简单的数据类型

    • 读取字符串时由于%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());
    
  2. 解析多个数据

    int a, b;
    sscanf("10 20", "%d %d", &a, &b);
    
  3. 返回值
    sscanf函数返回成功解析的数据项的个数。如果解析失败或没有匹配的数据项,则返回0。
    **

题目地址:牛客题目
参考文章:stringstream原文链接