各位,昨天查找子串的方法想起来了,就是那个KMP算法......自己理解都有点困难,还看看能不能想一下,确实很困难啊。
不要忘了toupper函数和tolower函数不是直接改变字符的大小写,而是返回对应的大小写的值,需要赋值。
这个在需要比较密码的时候,我是先用了一个二维数组,把账号,密码,邮箱三者分开读的,但其实感觉也可以用gets函数一次读入,然后从字符串的末尾开始比较,因为邮箱都在最后,然后以空格为界判断,密码,账号和邮箱。
但通过这个我好像发现这个网站是区分不出来,gets和fgets的,一律都是按gets运行的。
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
int main()
{char email[51] = { 0 };int n = 0;scanf("%s %d", email, &n);char(*a)[3][51] = (char*)malloc(sizeof(char) * n * 3 * 51);int(*b) = malloc(sizeof(int) * n);int i = 0, j = 0;for (i = 0; i < n; i++){scanf("%s %s %s", a[i][0], a[i][1], a[i][2]);if (strcmp(email, a[i][2]) == 0){b[j++] = i;int na = strlen(a[i][2]);int m = 0;for (m = 0; m < na; m++){if (islower(a[i][1][m]))a[i][1][m] = toupper(a[i][1][m]);elsea[i][1][m] = tolower(a[i][1][m]);}}}if (j == 0)printf("empty\n");elsefor (i = 0; i < j; i++){printf("%s %s\n", a[b[i]][0], a[b[i]][1]);}return 0;
}
这个一开始要么错一个,要么对一个,我还以为这个网站憨了,其实是它有一个没有明说的是字符串可能会以空格结尾,所以所以它这测试里面是有一个以空格结尾的,我就要么对这一个,要么就错这一个,对末尾空格的处理也不麻烦,额外判断一下就行,这个打印还是那个,就是要在多个数据中间打印 逗号之类的分隔符,我一开始还是把逗号和前面的绑定打印,后来才记起来之前的和后面绑定,真心感觉和后面绑定比较好处理,切记切记。
我这里需要额外判断的原因是如果最后为空格的话,会造成越界,其实没有越界,因为定义的数组比较大,但会导致 j 的值多加一,这样后面打印的时候就会多打印一个0(最开始的初值)
int main()
{char ch[1001] = { 0 };int b[300] = { 0 };gets(ch);int nc = strlen(ch);int i = 0, j = 0;for (i = 0; i < nc-1; i++){if (!isspace(ch[i]))b[j]++;else if (!isspace(ch[i + 1]))j++;}if (!isspace(ch[i]))b[j]++;printf("%d", b[0]);for (i = 1; i <= j; i++){printf(",%d",b[i]);}return 0;
}