如果阻塞,总会执行一些逻辑错误?

时间:2016-12-13 14:32:35

标签: c embedded

#include<stdio.h>
#include<string.h>
char Sys_Pass[]="3699";
char verify_Pass(char *P,char *Q)
{
    char ch;
    ch=strcmp(P,Q);
    printf("String Cmp %s,%s is %c %d\n",P,Q,ch,ch);
    if(ch==0)
        return 1;
    else
        return 0;
}
void main()
{
    char Pass[10],New[10];
    char fp=0,sp=0;
    printf("Enter Password : ");
    scanf("%s",Pass);
    if(fp=verify_Pass(Pass,Sys_Pass))
    {
Change:     printf("Enter a New Password : ");
        scanf("%s",Pass);
        printf("Re-Type New Password : ");
        scanf("%s",New);
        if(sp=verify_Pass(Pass,New))
        {
            strcpy(Sys_Pass,New);
            printf("Password Successfully changed\n");
            printf("New Password : %s\n",Sys_Pass);

        }
        else
            printf("Passwords Mismatch\n");
    }
    else
    {
        if(strcmp(Pass,"111999")==0);
            goto Change;
        printf("Wrong Password !!!\n");
    }
    printf("Fp : %c %d\nSp : %c %d\n",fp,fp,sp,sp);
}

此代码始终执行if块并提供密码更改,即使键入了错误的当前密码我想知道是否存在逻辑错误?

我正在开发一个8051项目,我想建立一个秘密密码更改,即如果我忘记了密码,我输入密码为111999,它应该指示我到密码更改菜单,但这里总是指示更改密码菜单。这实际上是嵌入式C代码,但我试图使用C代码纠正它,但在这两种情况下产生相同的输出。

2 个答案:

答案 0 :(得分:5)

你有一个迷路分号:

         // here ---------------v
    if(strcmp(Pass,"111999")==0);
        goto Change;

顺便说一句,这不是goto的好用。最好的办法是检查if条件下的当前密码或111999。

printf("Enter Password : ");
scanf("%s",Pass);
if ((strcmp(Pass,"111999")==0) || (strcmp(Pass,Sys_Pass)==0))
{
    printf("Enter a New Password : ");
    ...
}
else
{
    printf("Wrong Password !!!\n");
}

答案 1 :(得分:0)

此代码中有几件事情有改进余地,但我首先会问您是否使用调试器来调试问题。如果还没有,可以查看gdb:video here

我认为你也应该考虑改变你的主要因此它返回一个int,除了如果你有充分的理由不这样做。然后你可以有返回码。同样适用于main的输入参数。如果没有收到,我强烈建议您输入int main(void)来指定。请点击此处查看更多info

我个人总是在每个if / else块周围添加大括号,即使它是一行。它有助于避免错误。

我没有任何反对goto语句如果它被正确使用,但我相信在这种情况下不是。罗伯特马丁的清洁代码书包含一些关于如何使用它的好解释。我想你可以尝试重写这个并避免使用goto。