邮箱验证
POJ 注册的时候需要用户输入邮箱,验证邮箱的规则包括:
1)有且仅有一个'@'符号
2)'@'和'.'不能出现在字符串的首和尾
3)'@'之后至少要有一个'.',并且'@'不能和'.'直接相连
满足以上3条的字符串为合法邮箱,否则不合法,
编写程序验证输入是否合法
Input
输入包含若干行,每一行为一个代验证的邮箱地址,长度小于100
Output
每一行输入对应一行输出
如果验证合法,输出 YES
如果验证非法:输出 NO
Sample Input
.a@b.com
pku@edu.cn
cs101@gmail.com
cs101@gmail
Sample Output
NO
YES
YES
NO
本题原本不难,结果因为读题及对题意理解不清,导致被卡了很久。
首先说理解误区,原题说的是'@'不能和'.'直接相连
,然而只考虑了@.
这种相邻的情况,而忽视了。@
这种相邻的情况,(实力打脸……)。
剩余的问题就是按照其要求寻找不符合的情况,开始用的直接输出,不过在卡住之后又换成了使用flag来标记,最后统一输出,避免在判断后会有重复输出的问题(因为不能直接用return
来结束程序)。
代码如下:
#include <stdio.h>
#include <string.h>
int main (void)
{
char mail[101];
int i, x, y, flag, len, flag_1;
while(scanf("%s", mail) != EOF){
x = 0;
y = 0;
flag = 0;//标记是否存在'@'
flag_1 = 0;//标记是否输出'NO'
len = strlen(mail);
if(mail[0] == '@' || mail[0] == '.' || mail[len-1] == '@' || mail[len-1] == '.'){
flag_1 = 1;
}
/*遇到第一个'@'即停止*/
for(i = 0; i < len; i++){
if(mail[i] == '@'){
x++;//'@'的个数
flag = 1;
if(mail[i+1] == '.'){
flag_1 = 1;
}
break;
}
if(mail[i] == '.'){
flag = 1;
if(mail[i+1] == '@'){
flag_1 = 1;
}
break;
}
}
/*查找'@'之后'.'的个数*/
for(i++; i < len && flag; i++){
if(mail[i] == '.'){
y++;
}
if(mail[i] == '@')
x++;
}
if(x != 1 || !y){//'@'不唯一 或 '@'后不存在'.'
flag_1 = 1;
}
if(flag_1){
printf("NO\n");
}
else{
printf("YES\n");
}
}
return 0;
}