用户名,登录密码,以及注册时所使用手机号码。小华在这些网站上也注册了很多的账号,注册时对不同网站使用的用户名和密码都是不一样的,但绑定的手机号都是相同的,列表中信息很多,小华需要在这些信息当中找到自己的账号,然后把自己的密码改掉。注册时使用的用户名虽然不同,但绑定的手机号是一样的,所以小华可以根据自己的手机号来确定哪些是自己的账号了,找到账号之后可以对密码进行修改,修改密码的规则也很简单:将大小写字母互换即可,即如果是大写字母就转化为小写字母,若为小写字母就转化为大写字母。你可以帮助小华完成查找账号和修改密码的任务吗?
输入格式:
第一行:输入一个仅包含数字的字符串,表示小华在注册这些账号时所使用的手机号;
第二行:输入一个整数n,表示泄露的数据一共有n条。
接下来的n行:每一行包含三条信息,分别表示在不同网站上注册的用户名,密码以及手机号。它们之间用单个空格分开。用户名、密码、手机号均不含空格,且长度不超过50个字符。
输出格式:
有若干行,每行为一个账号,包括:账号,修改后的密码(之间用单个空格分隔)。
如果没有小华的账号,则输出empty。
输入样例1:
13612348765
5
helloKitty iLoveCats 13612348765
2012 maya2012 13256566565
KittyCat 5iKitty 13612348765
program password 16898765432
whoAmi Feb.29$ 13612348765
输入样例2:
13612348765
1
2012 maya2012 13612348788
输出样例1:
helloKitty IlOVEcATS
KittyCat 5IkITTY
whoAmi fEB.29$
输出样例2:
empty
首先说一下我的解题思路:因为信息比较多,有用户名,密码,手机号。我们可以建立一个结构体数组,结构体内容包含字符型的用户名,密码,手机号如:
struct S
{
char name[60];
char key[60];
char number[60];
};
每个数组的元素都包含这些内容:
struct S arr[n];
n为信息条数。
对于小华的真实手机号,我们可以单独建立一个数组
char num[60];
scanf("%s", num);
然后就开始去解题了,我们对结构体数组中的每个元素对其number和真实的手机号num进行比较如果全部都匹配则可以进一步对其密码(key)数组大小写进行转换。然后打印,如果匹配失败,直接break结束就行。然后对结构体数组的下一个元素进行以次比较。对于特殊情况,一次匹配都没有成功,进行标志性处理,输出empty就行了。大致思路就是这些,下面是代码。
#include <stdio.h>
struct S
{
char name[60];
char key[60];
char number[60];
};
int main()
{
char num[60];
scanf("%s", num);
int n;
scanf("%d", &n);
struct S arr[n];//VS2022会对arr[n]报错,n为未知量
int i = 0;
while (i < n)
{
scanf("%s%s%s", &arr[i].name, &arr[i].key, &arr[i].number);
i++;
}
int j = 0;
int op;
int cnt = 0;//有无匹配成功标志
while (j < n)
{
int k = 0;
op = 1;
while (num[k] != '\0')
{
if (num[k] == arr[j].number[k])
{
}
else
{
op = 0;
break;
}
k++;
}
if (op)
{
cnt = 1;
int l=0;
while (arr[j].key[l]!='\0')
{
if (arr[j].key[l] >= 'A' && arr[j].key[l] <= 'Z')
{
arr[j].key[l] = arr[j].key[l] + 32;
}
else if (arr[j].key[l] >= 'a' && arr[j].key[l] <= 'z')
{
arr[j].key[l] = arr[j].key[l] - 32;
}
else
{
}
l++;
}
printf("%s %s\n", arr[j].name, arr[j].key);
}
j++;
}
if (!cnt)
{
printf("empty");
}
return 0;
}