样例输入:
123@npu.com
样例输出:
YES
思想
所有的情况都想到了,但是懒得写,就写了部分情况,能过一半:
#include <bits/stdc++.h>
using namespace std;
string username, hostname;
int main() {
string s;
getline(cin, s);
int idx1 = 0, idx2 = 0, cnt = 0;
for (int i = 0; i < s.size(); i++) {
if (s[i] == '@') {
idx1 = i;
cnt++;
}
if (s[i] == '/') {
idx2 = i;
}
}
username = s.substr(0, idx1);
cout << username << endl;
if (idx2 != 0) {
hostname = s.substr(idx1 + 1, idx2);
cout << hostname << endl;
}
else {
hostname = s.substr(idx1 + 1);
cout << hostname << endl;
}
//检查合法性
//检查 username
int isUser = 0;
for (int i = 0; i < username.size(); i++)
{
if (username.size() < 1 || username.size() > 16)isUser = 1;
if (!isalnum(username[i]) && username[i] != '_')
{
isUser = 1;
}
}
//检查hostname
int isHost = 0;
for (int i = 0; i < hostname.size(); i++)
{
if (hostname[i] == '.')
{
if (hostname[i + 1] == '.')isHost = 1;
}
if (hostname[0] == '.' || hostname[hostname.size() - 1] == '.')isHost = 1;
}
if (isUser == 0 && isHost == 0) cout << "YES";
else cout << "NO";
return 0;
}
看着题解抄一下代码吧:
#include<bits/stdc++.h>
using namespace std;
string username, hostname,resource;
int cnt;
bool check(char ch)
{
if (ch>='a'&&ch<='z'
||ch>='A'&&ch<='Z'
||ch>='0'&&ch<='9'
|| ch == '_'
)return true;
return false;
}
bool Username()
{
int len = username.size();
if (len == 0 || len > 16) return false;
for (int i = 0; i < len; i++)
{
if (!check(username[i]))
return false;
}
return true;
}
bool Hostname()
{
int len = hostname.size();
if (hostname[0] == '.'||len==0||len > 32||hostname[len - 1] == '.')return false; //host的总长度不能超过32
for (int i = 1; i < len - 2; i++)
{
if (hostname[i] == '.' && hostname[i + 1] == '.')return false;
}
int sum = 0;
for (int i = 0; i < len; i++)
{
if (hostname[i] != '.' && !check(hostname[i]))return false; //如果不是小数并且不合法就返回false
if(hostname[i]!='.')
cnt++; //统计一下每个分段的长度
else
{
if (cnt > 16)return false; //每一个分段的长度不能超过16
sum = 0;
}
}
if (sum > 16)return false;
return true;
}
bool Resource()
{
int len = resource.size();
if (len == 0)return false;
for (int i = 0; i < len; i++)
{
if (!check(resource[i]))return false;
}
return true;
}
int main()
{
int p1 = 0, p2 = 0;
string s; cin >> s;
p1 = s.find('@'), p2 = s.find('/');
//cout << "p1: " << p1 << " " << "p2: " << p2 << endl;
if (p1 == string::npos)
{
cout << "NO";
return 0;
}
username = s.substr(0, p1);
if (p2 == string::npos)
{
hostname = s.substr(p1 + 1);
}
else
{
hostname = s.substr(p1 + 1, p2 - (p1 + 1));
}
//cout<<"username: "<<username<<" "<<"hostname: "<<hostname<<endl;
//如果有'/'存在,但是没有resource字段,非法
if (p2 != string::npos)
{
resource = s.substr(p2 + 1);
if (!Resource())
{
cout << "No";
return 0;
}
}
if (Username() && Hostname()) cout << "YES";
else cout << "NO";
return 0;
}