题解 | #冰冰的电子邮箱#
冰冰的正多边形
https://ac.nowcoder.com/acm/contest/93218/A
C语言实现,失败了很多次,忽略了字符串长度的限制,以下是题解,可能比较冗余
#include <string.h>
int EmailCheck(char address[])
{
// 判断字符串首尾是否是'.'或者'-'
if (address[0] == '.' || address[strlen(address) - 1] == '.' || address[strlen(address) - 1] == '-')
{
return 0;
}
// 声明一个local的字符数组记录@前面的字符串
char local[1000];
// 声明一个domain的字符数组记录@后面的字符串
char domain[1000];
// 声明一个flag记录@的个数
int flag = 0;
int i = 0;
// 记录local数组的字符个数
int local_sum = 0;
// 记录domain数组的字符个数
int domain_sum = 0;
//
while (address[i] != '\0')
{
if (address[i] == '@') // 判断字符是否等于@
{
flag++; // 如果等于flag++
}
if (flag == 0) // 判断是否遇到@ 如果没遇到就把@前面的字符添加到local数组
{
local[i] = address[i];
local_sum++; // local数组个数++
}
else if (flag == 1) // 如果遇到了@ 就把@后面的字符添加到domain数组
{
domain[i - local_sum] = address[i + 1];
domain_sum++; // domain数组个数++
}
else // 如果遇到多个@,输入不合法,直接结束判断返回0
{
return 0;
}
i++; //
}
// 判断local数组的末尾是否为'.', domain数组的第一个是否为'.'或者'-'
if (local[local_sum - 1] == '.' || domain[0] == '.' || domain[0] == '-')
{
return 0;
}
// 判断local数组是否为空,domain数组除去'\0'之后是否为空,local数组个数是否超过64,domain数组个数是否超过255
if (local_sum == 0 || domain_sum - 1 == 0 || local_sum > 64 || domain_sum - 1 > 255)
{
return 0;
}
// 判断local数组里面字符的范围或者合法性
for (int i = 0; i < local_sum; i++)
{
if (
!((local[i] >= '0' && local[i] <= '9')
|| (local[i] >= 'a' && local[i] <= 'z')
|| (local[i] >= 'A' && local[i] <= 'Z')
|| local[i] == '.')
)
{
return 0;
}
}
// 判断domain数组里面字符的范围或者合法性
for (int i = 0; i < domain_sum - 1; i++)
{
if (
!((domain[i] >= '0' && domain[i] <= '9')
|| (domain[i] >= 'a' && domain[i] <= 'z')
|| (domain[i] >= 'A' && domain[i] <= 'Z')
|| domain[i] == '.' || domain[i] == '-')
)
{
return 0;
}
}
// 表示通过检测
return 1;
}
int main()
{
int num = 0;
scanf("%d", &num);
for (int i = 0; i < num; i++)
{
char address[2000];
scanf("%s", address);
if (EmailCheck(address))
{
printf("Yes\n");
continue;
}
printf("No\n");
}
return 0;
}