C:Strings" eating"循环(也许)

时间:2015-12-05 15:24:35

标签: c

我有一些来自学校的练习在C练习,我从昨天开始就一直在练习它们,但是我对某个特定的练习非常僵硬。

在此程序中,必须重复最多5次或直到用户未能回答"安全问题":

用户必须被问到3次密码(最初" abc123"),如果用户不知道密码,他必须回答安全问题("你最喜欢的颜色是什么?"答案是"没有")2倍的上衣。如果他/她没有正确回答,它应该显示" Acound已锁定。"并且应该终止循环,或者如果他/她确实知道安全问题的答案,那么他/她键入一个新密码,该密码应该适用于其余的循环。

但似乎字符串不知何故"吃"一些循环。我使用过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;     
}

更新:

我对代码进行了一些修改,感谢回复(你是所有令人惊叹的)并且它就像一个魅力,只有当你最终得到正确的答案时,它才会保持打印(GIVE PASSWORD)永远,由于第一次转到CHECKPOINT,不是5次上衣。有什么想法吗?

#include <stdio.h>          
#include <stdlib.h>
#include <string.h> 
int main()
{
char temp[7];
char CODE[7] = "abc123"; 
char pin[7];
char safepin[7];
char newpin[7];
int i=0, p=0, k=0;  
int verified = 0;
i = 0;
k = 0;

CHECKPOINT:

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");
       verified = 1;
       goto CHECKPOINT;
       }
    else
    {             
          p = 0;
          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);
                strcpy(pin, CODE);
                goto CHECKPOINT;
          }
          else  
                {
                printf("Account locked.\n");       
                verified = 1;
                }
    }
printf("***************\n\n");
k++;
}while(k<5 && !verified);

system("pause");
return 0;    
}

1 个答案:

答案 0 :(得分:0)

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

while(!verified && k<5)

另外,正如我在评论中指出的那样,我会将所有变量声明及其初始化移到'main'中。这样它们就是例程的本地,并在运行时而不是编译/链接时初始化。

最后,虽然我意识到这是一项任务,而不是你正在编写的“真正的”安全例程,为了培养良好的实用习惯 - 我会逐渐(重新初始化)变量,尤其是持有验证密码的变量,在退出之前,以防止他们稍后由熟练的黑客进行秘密检查。即使在生产中,这对于非安全相关代码也永远不会有利,但是当代码是关键安全组件时,您必须考虑的事情类型。

我运行了你的程序,除了这些东西之外,它似乎像宣传的那样工作。