我有一些来自学校的练习在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;
}
答案 0 :(得分:0)
当我运行这个程序时,我注意到的唯一的事情就是外循环想重复5次而不管。您可以通过添加一个名为'verified'或'correct'(只使用int值)的标志来解决此问题,该标志初始化为0并在发出W E L C O M E消息的同一位置设置为1。然后改变你的外观以包括检查这个标志,例如
while(!verified && k<5)
另外,正如我在评论中指出的那样,我会将所有变量声明及其初始化移到'main'中。这样它们就是例程的本地,并在运行时而不是编译/链接时初始化。
最后,虽然我意识到这是一项任务,而不是你正在编写的“真正的”安全例程,为了培养良好的实用习惯 - 我会逐渐(重新初始化)变量,尤其是持有验证密码的变量,在退出之前,以防止他们稍后由熟练的黑客进行秘密检查。即使在生产中,这对于非安全相关代码也永远不会有利,但是当代码是关键安全组件时,您必须考虑的事情类型。
我运行了你的程序,除了这些东西之外,它似乎像宣传的那样工作。