gpt4 book ai didi

C: 字符串 "eating"循环(可能)

转载 作者:太空宇宙 更新时间:2023-11-04 04:32:44 25 4
gpt4 key购买 nike

我有一些学校的 C 练习练习,从昨天开始我就一直在做这些练习,但我对某个特定的练习非常生硬。

在这个程序中,它必须重复最多 5 次或直到用户未能回答“安全问题”:

必须要求用户输入密码(最初是“abc123”)3 次,如果用户不知道密码,他必须回答一个安全问题(“你最喜欢什么颜色?”,答案是“无”)2次。如果他/她对此也没有正确回答,它应该显示“声音已锁定”。并且循环应该终止,或者如果他/她确实知道安全问题的答案,那么他/她输入一个新密码,该密码应该适用于其余循环。

但似乎字符串以某种方式“吃掉”了一些循环。我用过 getchar() 但它似乎没有任何效果。另外,我认为我在需要重复 5 次的大型 do-while 上犯了一个错误。

我做错了什么?

#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;
}

更新:

我稍微修改了代码,多亏了回复(你们都很棒),它就像一个魅力,只有当你最终得到正确答案时,它才会永远打印(给出密码),由于第一次转到 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;
}

最佳答案

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

while(!verified && k<5)

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

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

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

关于C: 字符串 "eating"循环(可能),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34107171/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com