【问题标题】:I want my code to repeat 3 times but the loop does not end. Does anyone know how I could fix this issue?我希望我的代码重复 3 次,但循环没有结束。有谁知道我该如何解决这个问题?
【发布时间】:2021-03-13 06:59:18
【问题描述】:

代码如下:

    #include <stdio.h>
    #include <string.h>
    #include <conio.h>
    #include <iostream>
    #define repeat(n)
    #define endrepeat

    int main()
    {
    int login;
    
    char Username [4];
    char Password [4];
 
    printf("\t\tPlease enter your user name: ");
    scanf("%s", Username);
    printf("\t\tPlease enter your user password: ");
    scanf("%s", Password);

    if (strcmp (Username,"Jane")==0 && strcmp(Password,"1234")==0 || 
    strcmp(Username,"Arin")==0 && strcmp (Password,"3201")==0 || strcmp 
    (Username,"Jake")==0 && strcmp (Password,"4312")==0 || strcmp 
    (Username,"Jazz")==0 && strcmp (Password,"4456")==0)
    {
    printf("ACCESS GRANTED");

    system("CLS");
    getch();
    }
    
    else
    {
    printf("INVALID USERNAME OR PASSWORD ENTERED.\n");
    printf("\t\tPlease enter your user name: ");
    scanf("%s", Username);
    printf("\t\tPlease enter your user password: ");
    scanf("%s", Password);
    }
    int repeat;
    repeat = 0;
    do  {
    printf("INVALID USERNAME OR PASSWORD ENTERED.\n");          
    printf("\t\tPlease enter your Username: ");
    scanf("%s", Username);
    printf("\t\tPlease enter your password: ");
    scanf("%s", Password);
    repeat + 1 ;
    } while(repeat<3);
    endrepeat;
    
    return 0;
    }

我希望代码在退出前重复 3 次。当我尝试运行代码时,它会不断重复。我是编码新手,很抱歉,如果它很容易解决。 :) 我尝试过使用不同的重复方法,但我仍然遇到同样的问题。

【问题讨论】:

  • 学习调试器的最佳机会。观察计数器的值如何变化。您的代码中的 C++ 在哪里?
  • repeat + 1; 行不会更改变量值。我想你的意思是写repeat += 1;。由于您只增加 1,因此您可以使用增量运算符 ++repeat;。另外,你为什么不使用for 循环?您可以轻松完成for (size_t repeat {0}; repeat &lt; 3; ++repeat) { ... }

标签: c++ repeat


【解决方案1】:

像这样增加repeat 变量:

repeat = repeat + 1;

repeat += 1;

repeat++;

if 语句中使用括号分隔逻辑,避免得到错误结果,如下所示:

if ((strcmp(Username,"Jane") == 0 && strcmp(Password,"1234") == 0) || 
(strcmp(Username,"Arin") == 0 && strcmp(Password,"3201") == 0) || 
(strcmp(Username,"Jake") == 0 && strcmp(Password,"4312") == 0) || 
(strcmp(Username,"Jazz") == 0 && strcmp(Password,"4456") == 0))
{

摆脱else 语句,只需使用带有if 语句的do-while 循环。或者更好的是,您可以创建一个单独的函数来接收和验证输入。这将使所有内容更具可读性。

类似:

bool requestInput()
{
   printf("\t\tPlease enter your Username: ");
   scanf("%s", Username);
   printf("\t\tPlease enter your password: ");
   scanf("%s", Password);

   if ((strcmp(Username,"Jane") == 0 && strcmp(Password,"1234") == 0) || 
       (strcmp(Username,"Arin") == 0 && strcmp(Password,"3201") == 0) || 
       (strcmp(Username,"Jake") == 0 && strcmp(Password,"4312") == 0) || 
       (strcmp(Username,"Jazz") == 0 && strcmp(Password,"4456") == 0))
   {
       return true;
   }

   printf("INVALID USERNAME OR PASSWORD ENTERED.\n");
   return false;
}


int main()
{
   bool accessGranted;
   int repeat = 0;

    do {
        accessGranted = requestInput();
        repeat++;
    } while(repeat<3 && !accessGranted);

    if(accessGranted)
    {
       printf("ACCESS GRANTED");
       // ...
    }
}

【讨论】:

  • 如果我希望它在输入正确的用户名和密码后退出循环,我是否要创建另一个 if 语句?
  • @jessi_jebbie 如果变量repeat 达到3 或accessGranted 变为truedo-while 循环将自行终止。无需额外的if 语句。
【解决方案2】:

repeat 变量加1 后,您必须保存结果,例如,像这样:

repeat = repeat + 1

较短的替代方案是

repeat += 1

repeat++

一般来说,在这种情况下,我会使用 for 循环。

【讨论】:

    猜你喜欢
    • 2023-02-03
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2019-05-22
    • 2016-02-19
    • 1970-01-01
    相关资源
    最近更新 更多