各位,昨天查找子串的方法想起来了,就是那个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]);
else
a[i][1][m] = tolower(a[i][1][m]);
}
}
}
if (j == 0)
printf("empty\n");
else
for (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;
}