C:字符串“;“吃”;循环(可能)

C:字符串“;“吃”;循环(可能),c,C,我在C学校有一些练习,从昨天开始我就一直在练习,但我对一个特别的练习很生硬 在该程序中,必须重复5次或直到用户无法回答“安全问题”: 必须向用户询问3次密码(最初为“abc123”),如果用户不知道密码,他必须回答2次安全问题(“您最喜欢的颜色是什么?”,答案为“无”)。如果他/她没有正确回答这个问题,它应该显示“Acound locked”。循环应该终止,或者如果他/她知道安全问题的答案,那么他/她会键入一个新密码,该密码应该适用于其余的循环 但似乎弦不知何故“吃掉”了一些循环。我使用了get

我在C学校有一些练习,从昨天开始我就一直在练习,但我对一个特别的练习很生硬

在该程序中,必须重复5次或直到用户无法回答“安全问题”:

必须向用户询问3次密码(最初为“abc123”),如果用户不知道密码,他必须回答2次安全问题(“您最喜欢的颜色是什么?”,答案为“无”)。如果他/她没有正确回答这个问题,它应该显示“Acound locked”。循环应该终止,或者如果他/她知道安全问题的答案,那么他/她会键入一个新密码,该密码应该适用于其余的循环

但似乎弦不知何故“吃掉”了一些循环。我使用了getchar(),但它似乎没有任何效果。此外,我认为我犯了一个大错误,而这需要重复5次

我做错了什么

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

char temp[7];
char CODE[7] = "abc123";
char pin[7]; 
char safepin[7];
char newpin[7];
int i=0, p=0, k=0;  

int main()
{

do{
    do{
        printf("GIVE PASSWORD:\n");
        scanf("%s", pin);
        i++;
       } while (i<3 && strcmp (pin, CODE) != 0);

    if (strcmp(pin, CODE) == 0)
       printf("W E L C O M E !\n");
    else
    {
          do{
            printf("What's your favourite colour?\n");
            scanf("%s", safepin);
            p++;
             } while (p<2 && strcmp (safepin, "none") != 0);

       if (strcmp(safepin, "none") == 0)
          {
              printf("Type a new password:\n");
              scanf("%s", newpin);
              strcpy(temp, newpin);
              strcpy(CODE, temp);
              main();
          }
       else  
          printf("Account Locked\n");       

}
    printf("***************\n\n");
    k++;
}while(k<5);

system("pause");
return 0;     
}
#包括
#包括
#包括
炭温[7];
字符代码[7]=“abc123”;
char-pin[7];
char-safepin[7];
char-newpin[7];
int i=0,p=0,k=0;
int main()
{
做{
做{
printf(“给出密码:\n”);
扫描频率(“%s”,引脚);
i++;

}然而(我当我运行这个程序时,我注意到的唯一一件事是,不管怎样,外部循环都要重复5次。你可以通过添加一个名为“verified”或“correct”的标志来解决这个问题(只需使用一个int值)在您发出W E L C O M E消息的同一位置初始化为0并设置为1。然后更改外部外观以包括对该标志的检查,例如

while(!verified && k<5)

while(!verified&&k当我运行这个程序时,我注意到的唯一一件事是,不管怎样,外部循环都要重复5次。你可以通过添加一个名为“verified”或“correct”的标志来解决这个问题(只需使用一个int值)在您发出W E L C O M E消息的同一位置初始化为0并设置为1。然后更改外部外观以包括对该标志的检查,例如

while(!verified && k<5)

while(!verified&&kSo)当用户键入新密码时,在程序要求他提供密码后立即执行。由于密码已更改,用户创建的密码应能工作,然后显示“W E L C O M E!”在你的作业中,我注意到我将改变的一件事是,对例程真正本地的东西使用全局变量。如果你以后将main更改为authenticate_user这样的函数,这些变量在重用时不会重新初始化,更糟糕的是,会在过程中保留敏感信息d可供程序的其余部分或知道如何检查正在运行的进程的地址空间的窥探者使用。当你说字符串似乎在“吃掉”你的循环时,你的确切意思是什么?我一直在测试将变量放入和移出main(),但我认为问题在于do while循环。当五个循环中的第一个循环完成时,下一次“给出密码”thingy只出现两次,你最喜欢的颜色是什么?一次。因此,当用户键入新密码时,程序要求他立即给出密码。由于密码已更改,用户所做的密码应该有效,然后显示“We L C O M E!”在你的作业中,我注意到我将改变的一件事是,对例程真正本地的东西使用全局变量。如果你以后将main更改为authenticate_user这样的函数,这些变量在重用时不会重新初始化,更糟糕的是,会在过程中保留敏感信息d可供程序的其余部分或知道如何检查正在运行的进程的地址空间的窥探者使用。当你说字符串似乎在“吃掉”你的循环时,你的确切意思是什么?我一直在测试将变量放入和移出main(),但我认为问题在于do while循环。当五个循环中的第一个循环完成时,下一次“给出密码”只会出现两次,你最喜欢的颜色是什么?一次。所以我做了“验证”标志,但现在,每次我输入新密码,它都不会接受。只有第一个(abc123).更新:能够通过内部的goto检查点超越该检查点(如果(strcmp(safepin,“none”)==0))在变量声明之后有一个检查点。重构代码结构以消除goto可能是一个好的做法。你的导师可能会也可能不会对goto有任何意见,但由于Edsger W.Dijkstra现在著名(或声名狼藉,取决于你的观点)的声明(转到有害的)它们的使用非常有限。但无论你做什么,都不要扔掉一个工作程序。按时完成任务是你的王牌。我已经做了30多年的软件开发人员,除了状态机之外,我一方面可以知道我使用过多少台。所以我做了“验证”但是现在,每次我输入一个新密码后,它都不会接受。只有第一个(abc123)。更新:能够通过内部的goto检查点超越它(如果(strcmp(safepin,“none”)==0))在变量声明之后有一个检查点。重构代码结构以消除goto可能是一个好的做法。你的导师可能会也可能不会对goto有任何意见,但由于Edsger W.Dijkstra现在著名(或声名狼藉,取决于你的观点)的声明(转到有害的)它们的使用非常有限。但无论你做什么,都不要扔掉一个工作程序。按时完成任务是你的王牌。我已经做了30多年的软件开发人员,除了国家机器之外,我一方面可以计算出我在我们之间做过多少次