【问题标题】:How do I get console to loop until the right input is entered in C?如何让控制台循环,直到在 C 中输入正确的输入?
【发布时间】:2014-12-17 23:51:48
【问题描述】:

我有一个 C 程序,通过接受输入选择来模拟用户和程序之间的 ATM 交互,然后产生输出。

用户必须输入值 1111,交易才能继续,如果不是这样,程序会打印出错误并不断要求用户输入正确的密码,直到程序读入 1111。

我尝试使用 while 循环来不断请求正确的值 1111,并且在输入之前,程序一直要求用户输入正确的 pin。

void main() {

    int pin;

    printf("Please enter the default pin: ");

    while ( pin != 1111 ) 
    {
        printf("Invalid input ");
        printf("Please enter the default pin again: ");
        scanf("%d", &pin);

        if (pin == 1111) 
        {
            //The program continues
        }

    }     
}

每次我输入错误的密码时,它都会再次要求输入密码,然后由于程序停止工作的错误而崩溃。我想我造成了一个无限循环,但我不太确定发生了什么。

【问题讨论】:

  • 您将pin 初始化为一个合适的值,然后直接转到while !good value,它根本不会循环。因此,要么您没有发布正确的代码,要么您没有看到任何密码提示。

标签: c input while-loop


【解决方案1】:

scanf 返回结果(成功读取的项目数)。您应该使用该结果。阅读scanf(3) 以及您正在使用的每个函数的文档。另外,在每个printf 格式控制字符串的末尾添加一个\n(或调用fflush(3)...)

编译时包含所有警告和调试信息 (gcc -Wall -g)。然后使用调试器 (gdb)

【讨论】:

    【解决方案2】:

    你可能想要这个:

    void main()
    {
      int pin ;
    
      printf("Please enter the default pin: ");
      scanf("%d", &pin);  
    
      while ( pin != 1111 ) 
      {
        printf("Invalid input\n");
        printf("Please enter the default pin again: ");
        scanf("%d", &pin);
      }
    
     printf("program continues...");  //The program continues
    }
    

    示例执行

    Please enter the default pin: 1234
    Invalid input
    Please enter the default pin again: 2222
    Invalid input
    Please enter the default pin again: 1111
    program continues...
    

    【讨论】:

    • 不,scanf 应该始终对其结果进行测试!
    • @BasileStarynkevitch 对,但我认为现阶段我们可以忽略这一点。
    • 不,你不能,因为你没有初始化pin。如果scanf 失败,pin 保持未初始化状态。
    • @BasileStarynkevitch 你是对的,但scanf 无论如何都是邪恶的。 fgets 在这里会是更好的选择。当我提到“现阶段”时,我指的是 OP 的 C 知识。
    • @MichaelWalz 我试过这样做,但我只被要求再输入一次正确的引脚,然后下次我输入另一个不正确的值时程序崩溃。
    【解决方案3】:

    这将检查 scanf 是否成功读取整数。如果失败,它将读取一个字符并重试。
    如果 scanf 读取一个整数,则检查它是否是正确的引脚。如果没有,它会重新提示并再次 scanfs。

    #include<stdio.h>
    #include<stdlib.h>
    
    int main() {
        int pin = 0;
        int ch = 0;
    
        printf ( "Enter the default pin\n");
        while ( pin != 1111) {
            if ( scanf ( "%d", &pin) == 1) { // scanf read an int                                                             
                if ( pin == 1111) {
                    break; // the correct pin                                                                                 
                }
                else {
                    printf ( "Enter the default pin\n"); //reprompt                                                           
                }
            }
            else {
                while ( ( ch = getchar()) != '\n') { //scanf failed to read int. clear input and retry
                    if ( ch == EOF) {
                        fprintf ( stderr, "problem getting input\n");
                        return 1;//if EOF exit
                    }
                }
            }
        }
    
        return 0;
    }
    

    【讨论】:

    • 为什么在循环失败的情况下需要getchar()。有什么东西卡在流中了吗?没有它,我的程序会循环,但不会再次扫描。
    • 看到这就是我的想法,所以我尝试使用fflush(stdin) 而不是getchar()。是否有特定原因不起作用?
    猜你喜欢
    • 2021-11-19
    • 2018-01-11
    • 2011-06-27
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    相关资源
    最近更新 更多