P7911 [CSP-J 2021] 網路連線
阿新 • • 發佈:2021-11-03
完全出錯位置。。。
題目分析
需要注意的一些事情:
- 必須要有 \(3\) 個
.
,要有 \(1\):
。
給定一個串,為 a.b.c.d:e
。
-
\(0\le a,b,c,d\le255,0\le e\le65535\)。
-
數必須要有 \(5\) 個數。
-
其他字母得爬。
大家總在說什麼 \(STL\) 好用 (事實確實如此),但是在字串的某些處理上 C 語言也有一些優秀之處,比如這道題上。
可以使用 strcmp
,sprintf
,sscanf
。
這裡簡要介紹下下:
strcmp
:
基本形式為 \(\rm strcmp(str1,str2)\)。
如果返回值小於 \(0\)
,則表示 \(\rm str1\) 小於 \(\rm str2\)。如果返回值大於 \(0\),則表示 \(\rm str1\) 大於 \(\rm str2\)。
如果返回值等於 \(0\),則表示 \(\rm str1\) 等於 \(\rm str2\)。
sscanf
:
這玩意兒與
scanf
唯一的區別是它是以固定字串為輸入源的。格式為
sscanf(str,"...",...)
,表示從字串 \(\rm str\) 讀入。
sprintf
:
這玩意兒與
printf
唯一的區別是它是以固定字串為輸出源的。格式為
sprintf(str,"...",...)
,表示把""
內的字元輸到指定字串 \(\rm str\) 中。
具體的使用可以自行查閱百度百科。
程式碼
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstdio> #include <climits>//need "INT_MAX","INT_MIN" #include <map> #include <string> #include <cstring> #define enter() putchar(10) #define debug(c,que) cerr<<#c<<" = "<<c<<que #define cek(c) puts(c) #define blow(arr,st,ed,w) for(register int i=(st);i<=(ed);i++)cout<<arr[i]<<w; namespace Newstd { inline int read() { char c; bool flag=false; while((c=getchar())<'0' || c>'9') { if(c=='-') flag=true; } int res=c-'0'; while((c=getchar())>='0' && c<='9') { res=(res<<3)+(res<<1)+c-'0'; } return flag?-res:res; } inline void print(int x) { if(x<0) { putchar('-');x=-x; } if(x>9) { print(x/10); } putchar(x%10+'0'); } } using namespace Newstd; using namespace std; const int MA=105; int n; map<string,int>mp; inline bool chk(int x) { if(x<0 || x>255) { return true; } return false; } inline bool chk(char* str) { int a=-1,b=-1,c=-1,d=-1,e=-1; int t=sscanf(str,"%d.%d.%d.%d:%d",&a,&b,&c,&d,&e); if(t!=5) { return false; } if(chk(a)==true || chk(b)==true || chk(c)==true || chk(d)==true) { return false; } if(e<0 || e>65535) { return false; } char tmp[MA]; sprintf(tmp,"%d.%d.%d.%d:%d",a,b,c,d,e); return strcmp(str,tmp)==false; } int main(void) { //freopen("network.in","r",stdin); //freopen("network.out","w",stdout); std::ios::sync_with_stdio(false); cin>>n; for(register int i=1;i<=n;i++) { char opt[MA],name[MA]; cin>>opt>>name; string now=name; if(opt[0]=='S') { if(chk(name)==false) { cout<<"ERR"<<endl; } else if(mp.count(now)!=0) { cout<<"FAIL"<<endl; } else { cout<<"OK"<<endl; mp[now]=i; } } else { if(chk(name)==false) { cout<<"ERR"<<endl; } else if(mp.count(now)==0) { cout<<"FAIL"<<endl; } else { cout<<mp[now]<<endl; } } } return 0; }