【问题标题】:What is the problem in this code when I run the code it does not give the desired output当我运行代码时,这段代码有什么问题,它没有给出所需的输出
【发布时间】:2021-09-06 07:42:42
【问题描述】:
#include<stdio.h>
#include<string.h>
#include<conio.h>
int main()
{
char pwd[5];
int i;
printf("Enter your password: ");
for(i=0;i<=3;i++)
{
pwd[i]=_getch();
printf("%c",pwd[i]);
 if(pwd[i]==8)
  {
    if(i>0)
    {
    printf(" \b");
    i--;
    continue;
    }
    else
        break;
  }
}
pwd[i]='\0';
if(strcmp(pwd,"abcd")==0)
{
printf("\nPassword is correct");
}
else
{
printf("\nPassword is not correct");
}
return 0;
}

我希望以这样的形式输出,当用户按下退格键时,前一个字符应该被删除,并且应该允许用户重新输入前一个字符,但是这段代码有一些问题。 它删除了前一个字符,但不允许重新输入前一个更正的字符,而是将其作为下一个字符,请问这段代码有什么问题?

【问题讨论】:

  • 一个问题是使用支持dos.hconio.h 的过时C 编译器——你应该升级到当前千年的东西,而不是使用千年之交的史前版本。
  • 您的代码对输入时的反斜杠字符没有什么特别的作用。您检测到退格字符(很糟糕——您应该使用 '\b' 而不是 8),但这与反斜杠字符非常不同。
  • 请进一步解释“当我输入行为异常时”的含义。什么是“东西”?您遇到了什么样的不当行为?
  • edit解释。
  • 旁白:请将换行符放在邮件的末尾,而不是开头,例如printf("Password is correct\n");

标签: arrays c function if-statement decrement


【解决方案1】:

此代码中存在错误。在if (i &gt; 0) 语句内的第18 行,您将变量i 的值减1,这没关系。但是,您不是“重新输入”pwd[i]. 并且请记住,将 '\b' 添加到您的字符串并不会删除它的前一个字符。它宁可“添加”一个新角色,但你被输出打败了。所以这是一个修复了错误的工作代码:

#include<stdio.h>
#include<string.h>
#include<conio.h>
int main()
{
    char pwd[5];
    int i;
    printf("Enter your password: ");
    for(i=0; i<=3; i++)
    {
        label:
        pwd[i]=_getch();
        printf("%c",pwd[i]);
        if(pwd[i]==8)
        {
            if(i>0)
            {
                printf(" \b");

                i--;
                goto label;
                continue;
            }
            else
                break;
        }
    }
    pwd[i]='\0';
    if(strcmp(pwd,"abcd")==0)
    {
        printf("\nPassword is correct");
    }
    else
    {
        printf("\nPassword is not correct");
    }
    return 0;
}

我认为这对我来说已经足够解释了。剩下的就是让您花时间了解代码。编码愉快!

【讨论】:

  • 谢谢,但请告诉我是否可以不使用 goto 编写此代码,因为我的老师说您不应该使用 goto,因为它是一种不好的编程习惯。
  • "goto 本身并不坏。只有在不适当的地方使用时才不好。"很多初学者在使用goto的时候会因为对某些点缺乏了解而犯错误。如果您想阅读有关 goto 是好是坏的完整论点,请查看 stackoverflow 上的here is a post。简短的回答:在适当的地方(例如跳出循环)使用 goto 并没有坏处。如果您仍然担心,请在下方评论,我会找到其他方法。
  • 我对这部分代码有疑问:-。 for(i=0;i0) { printf(" \b");一世 - ;继续; } 否则中断; } }。为什么将 i 的值减 1 后的 continue 语句不会再次到达循环顶部并再次在减量的 pwd[i] vai _getch() 中取值并用它覆盖以前的值请解释我在哪里错了吗?为什么我需要在其中添加 goto。
  • 我明白你的意思。但是你一定忘记了,在for(i=0; i&lt;=3; i++)语句中,变量i的值又加了1。continue;语句跳过了循环的下一部分,但也将程序带到了下一轮.正如您已经知道的,循环的update statement(在本例中为i++)在for 循环的每一轮中执行。但是您不希望变量i 在再次输入之前递减。这就是你需要 goto 的原因,这样你就可以在循环进入下一轮之前再次获取输入并增加i
  • 很高兴为您提供帮助!这里有一个额外的提示:调试在大多数情况下有助于解决错误。可以read this article或者google了解调试。
猜你喜欢
  • 2022-06-13
  • 1970-01-01
  • 1970-01-01
  • 2021-08-28
  • 1970-01-01
  • 2018-01-24
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
相关资源
最近更新 更多