码蹄杯 邮箱地址 题型:大模拟

48 阅读2分钟

码题集OJ-邮箱地址 (matiji.net)

image.png 样例输入:

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;
}

image.png

看着题解抄一下代码吧:

#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;
}