C语言 紧急措施问题怎么解决?

C语言 紧急措施
程序基本完成,但是最后似乎只输出了最后一行的数据,是不是该用二维数组表示密码?

img


样例输入:
abc@pku.edu.cn
5
helloKitty iLoveCats abc@pku.edu.cn
2012 maya2012 cplusplus@exam.com
KittyCat 5iKitty abc@pku.edu.cn
program password teacher@exam.com
whoAmi Feb.29$ abc@pku.edu.cn

样例输出:
helloKitty IlOVEcATS
KittyCat 5IkITTY
whoAmi fEB.29$

下面是我的代码:

#include<stdio.h>
#include<string.h>
int main()
{
    char a0[51],a[51],b[51],c[51];//,a0是第一行email,a是下面的email,b是用户名,c是密码 
    int N,i,count=0;
    gets(a0);
    scanf("%d",&N);
    for(i=0;i<N;i++)
    {
        scanf("%s%s%s",b,c,a);
    }
    if(strcmp(a0,a)==0)//如果email相同,进行运算 
    {
        for(int j=0;j<strlen(c);j++)
        {
            if(c[j]>='A'&&c[j]<='Z')
            c[j]=c[j]+32;
        }
        for(int j=0;j<strlen(c);j++)
        {
            if(c[j]>='a'&&c[j]<='z')
            c[j]=c[j]-32;//变换大小写 
        }
        count=count+1;
        printf("%s %s",b,c);    
    }
    if(count==0)//没有执行上述步骤,说明email都不同 
    printf("empty"); 
    return 0;
}


 
  

下面是运行结果:

img

问题出在程序只输出了最后一组匹配的用户名和密码,这是因为在循环中,您每次都将新的用户名和密码覆盖了之前的值。要解决这个问题,可以采用以下方法:
使用数组存储匹配的用户名和密码:您可以使用一个数组来存储匹配的用户名和密码。每次匹配成功后,将用户名和密码存储在数组中,并递增数组的索引,以便在之后的操作中能够访问所有匹配项。
遍历数组并输出:在比较完成后,遍历存储匹配用户名和密码的数组,并输出它们。

【以下回答由 GPT 生成】

代码的问题在于,循环中使用的scanf函数只会读取一次输入,而你希望循环读取多行数据。此外,你还需要在循环外部输出结果。以下是修改后的代码:

#include<stdio.h>
#include<string.h>

int main()
{
    char firstEmail[51], email[51], username[51], password[51]; // firstEmail是第一行的电子邮件,email是后面的电子邮件,username是用户名,password是密码
    int N, i, count = 0;
    gets(firstEmail);
    scanf("%d", &N);
    fflush(stdin); // 清空输入缓冲区
    for (i = 0; i < N; i++)
    {
        scanf("%s %s %s", username, password, email);
        fflush(stdin); // 清空输入缓冲区
        if (strcmp(firstEmail, email) == 0) // 如果电子邮件相同,进行大小写转换
        {
            for (int j = 0; j < strlen(password); j++)
            {
                if (password[j] >= 'A' && password[j] <= 'Z')
                    password[j] = password[j] + 32;
            }
            for (int j = 0; j < strlen(password); j++)
            {
                if (password[j] >= 'a' && password[j] <= 'z')
                    password[j] = password[j] - 32; // 变换大小写
            }
            count = count + 1;
            printf("%s %s\n", username, password);
        }
    }
    if (count == 0) // 没有执行上述步骤,说明没有与输入电子邮件相同的行
        printf("empty\n");
    return 0;
}

这样修改后,程序会正确输出与输入电子邮件相同的行的用户名和转换后的密码,并在没有与输入电子邮件相同的行时输出"empty"。你不需要使用二维数组来表示密码,因为你每次只处理一行数据。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^