字符串的转换、逆置、删除重复元素及判断是否为邮件格式
1.给定的一个字符串,比如:this is my program,要求将每个单词的首字母大写,输出:This Is My Program 。
#include <stdio.h>#include <stdlib.h>#include <string.h>//KMP算法求子串在主串中的位置int next[100];void getnext(char *str){int i = 1, j = 0;next[1] = 0;while(i <= strlen(str)){if(j == 0 || str[i - 1] == str[j - 1]){i++; j++;next[i] = j;}else{j = next[j];}}}int kmp(char *a, char *b){int i = 1, j = 1; //i是主串中的位子 ,j匹配串的位子while(i <= strlen(a) && j <= strlen(b)){if(j == 0 || a[i - 1] == b[j - 1]){i++; j++;}else j = next[j];}if(j > strlen(b))return i - strlen(b);elsereturn 0;}//合法的email地址格式如下://1. 首字符必须用字母,而且其它的字符只能用26个大小写字母、0~9及_-.@符号后的//2. 必须包含一个并且只有一个符号“@”//3. @后必须包含至少一个至多三个符号“.”//4. 第一个字符不得是“@”或者“.”(第一步已检查过了)//5. 不允许出现“@.”或者.@//6. 结尾不得是字符“@”或者“.”int isvalidchar(char ch){if((ch >= 97) && (ch <= 122) ) //26个小写字母return 1;if((ch >= 65) && (ch <= 90) ) //26个大写字母return 1;if((ch >= 48) && (ch <= 57)) //0~9return 1;if(ch == 95 || ch == 45 || ch == 46 || ch == 64 ) //_-.@return 1;return 0;}//判定输入的字符串是否是正确的邮件地址,如果是返回1,否则返回0int isvalidemail(char *email){int i = 0;if(email == NULL)return 0;if(strlen(email) < 5) //26个小写字母return 0;char ch = email[0];if(((ch >= 97) && (ch <= 122)) || ((ch >= 65) && (ch <= 90))){int atcount =0; //"@"的个数int atpos = 0; //"@"所在的位置int dotcount = 0; //"."的个数for(i = 1; i < strlen(email); i++) //0已经判断过了,从1开始{ch = email[i];if(isvalidchar(ch)){if(ch == 64) //"@"{atcount++;atpos = i;}else if(atcount > 0 && ch == 46)//@符号后的"."号dotcount++;}elsereturn 0;}//结尾不得是字符“@”或者“.”if(ch == 46)return 0;//必须包含一个并且只有一个符号“@”//@后必须包含至少一个至多三个符号“.”if((atcount != 1) || (dotcount < 1) || (dotcount > 3))return 0;//不允许出现“@.”或者.@int x, y;x = kmp(email, "@.");y = kmp(email, ".@");if(x > 0 || y > 0)return 0;return 1;}return 0;}//接收一行字符(最多num个),使用gets易出现缓冲区溢出int getsline(char s[], int num){int i, c;for(i = 0; i < num - 1 && (c = getchar()) != EOF && c != '\n'; ++i)s[i] = c;s[i] = '\0';return i;}int main(){char str[100];while(1){getsline(str, 100);if(isvalidemail(str) == 1)puts("valid email");elseputs("invalid email");}return 0;}