65pts,re求助
查看原帖
65pts,re求助
1122958
yyz38楼主2024/9/6 21:50
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1005;
struct Computer 
{
    char a[10];//存储计算机类型
    char b[30];//存储地址串
};
Computer computers[MAXN];
int n;
bool panduan(const string& addr)//判断地址串是否符合规范
{
    int a,b,c,d,e;
    string tmp;
    int pos=addr.find(':');
    if(pos==string::npos)//如果没有冒号,地址不合法
		return false;
    string ip=addr.substr(0,pos);
    string port=addr.substr(pos+1);
    istringstream iss(ip);//分割字符串 
    char dot;
    if(!(iss>>a>>dot>>b>>dot>>c>>dot>>d)||dot!='.')//检查IP格式
		return false;
    if(a<0||a>255||b<0||b>255||c<0||c>255||d<0||d>255)//检查IP每段的范围
        return false;
    if(port.find_first_not_of("0123456789")!=string::npos)//检查端口是否为纯数字
		return false;
    e=stoi(port);
    if(e<0||e>65535)//检查端口范围
		return false;
    string ans=to_string(a)+"."+to_string(b)+"."+to_string(c)+"."+to_string(d)+":"+to_string(e);//重构地址串,检查是否与原地址串完全一致(避免前导零等问题)
    return ans==addr;
}
int Find(const char* addr,int cur)//查找是否有相同地址的服务器
{
    for(int i=1;i<cur;i++) 
        if(strcmp(computers[i].a,"Server")==0&&strcmp(computers[i].b,addr)==0)
            return i;
    return 0;
}
int main() 
{
    cin>>n;
    for(int i=1;i<=n;i++) 
	{
        cin>>computers[i].a>>computers[i].b;
        if(!panduan(computers[i].b)) 
		{
            cout<<"ERR"<<endl;
            continue;
        } 
        if(strcmp(computers[i].a,"Server")==0)
            if(Find(computers[i].b,i))
                cout<<"FAIL"<<endl;//如果已存在相同地址的服务器,输出FAIL
			else
                cout<<"OK"<<endl;
		else//客户机
		{
            int server=Find(computers[i].b,i);
            if(server)//如果找到对应的服务器,输出服务器编号
                cout<<server<<endl;
			else//否则输出FAIL
                cout<<"FAIL"<<endl;
        }
    }
    return 0;
}

码风有点怪,见谅

2024/9/6 21:50
加载中...