有人可以向我解释 scanf 如何使用 C 处理多个输入 session 吗?

标签 c while-loop scanf

在有人咆哮之前,我知道编码很丑陋,并且可能会很乏味地处理所有变量,但只有 for 循环,所以不要让这些打扰你。问题是,我必须接受用户的输入,即:帐号和帐户密码,并根据随机帐号和随 secret 码生成的内容检查他们是否输入正确的密码和帐号。我的检查帐号和帐户密码的功能正常工作,没有问题。我在那里有一些 DEBUG 语句来 try catch 问题发生的位置。我注意到 while 循环中发生的问题,如果用户在第一次尝试时错误地输入了帐号或密码,它会循环回来并再次询问,但是当它再次询问用户第二次的信息时尝试一下,包含用户新信息的数组不会存储新信息,而是仍然传递原始尝试中的旧信息。 scanf 是否有什么我不知道的事情,导致它无法扫描新信息而不是旧信息,或者甚至无法像那样工作?

示例输入和输出:

Account Number: 67561

PIN: 2531

Please Enter account Number: 67562

Please Enter account PIN: 2531

Account Number DEBUG: 67562Account PIN DEBUG: 2531

ACCNT2

PIN1

Please Enter account Number: 67561

Please Enter account PIN: 2531

Account Number DEBUG2: 67562Account PIN DEBUG2: 2531

DEBUG2 2DEBUG3 1Please Enter account Number: 

正如您在 Debug2 语句中的第二次尝试中所看到的,它仍然采用原始输入,而不是采用我分配给它的新输入。关于这里出了什么问题有什么想法吗?

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int check_login(int rand_account[], int account[]);
int check_login_pin(int rand_pin[], int pin[]);

int main(void) {

    char account_nmb[5],account_pin[4];
    int i,e,x,y,a,b,number=1,attempts=1,rand_pin[4], rand_account_number[5], account_nmb_int[5],account_pin_int[4];
    int d,f,account_number,account_pn,g,h,j,k;
    time_t t;

    srand((unsigned) time(&t));

    //generate array of rand account numbers and pin numbers
    for(x=0;x<5;x++){
        rand_account_number[x]=rand()%9;
    }
    for(y=0;y<5;y++){
        rand_pin[y]=rand()%9;
    }

    //print array of rand account numbers and pin numbers
    printf("Account Number: ");
    for(a=0;a<5;a++){
        printf("%d",rand_account_number[a]);
    }
    printf("\n");
    printf("PIN: ");
    for(b=0;b<4;b++){
        printf("%d",rand_pin[b]);
    }
    printf("\n");

    //Check User's input for match with random account number and pin
    while(attempts!=3){
        //Take user's input
        printf("Please Enter account Number: ");
        scanf("%s", account_nmb);
        for (i = 0; i < 5; i++ ) {
            account_nmb_int[i] = account_nmb[i] - '0';
        }
        printf("Please Enter account PIN: ");
        scanf("%s", account_pin);
        for (e = 0; e < 4; e++ ) {
            account_pin_int[e] = account_pin[e] - '0';
        }

        //DEBUG
        printf("Account Number DEBUG: ");
        for(d=0;d<5;d++){
            printf("%d",account_nmb_int[d]);
        }
        printf("Account PIN DEBUG: ");
        for(f=0;f<4;f++){
            printf("%d",account_pin_int[f]);
        }


        account_number=check_login(rand_account_number, account_nmb_int);
        account_pn=check_login_pin(rand_pin,account_pin_int);

        //DEBUG
        printf("\nACCNT%d",account_number);
        printf("\nPIN%d\n",account_pn);

        if(account_number==2||account_pn==2){
            printf("Please Enter account Number: ");
            scanf("%s", account_nmb);
            for (g = 0; g < 4; g++ ) {
                account_nmb_int[g] = account_nmb[g] - '0';
            }
            printf("Please Enter account PIN: ");
            scanf("%s", account_pin);
            for (h = 0; h < 4; h++ ) {
                account_pin_int[h] = account_pin[h] - '0';
            }

            //DEBUG
            printf("Account Number DEBUG2: ");
            for(d=0;d<5;d++){
                printf("%d",account_nmb_int[d]);
            }
            printf("Account PIN DEBUG2: ");
            for(f=0;f<4;f++){
                printf("%d",account_pin_int[f]);
            }
            printf("\n");

            account_number=check_login(rand_account_number, account_nmb_int);
            account_pn=check_login_pin(rand_pin,account_pin_int);
            //DEBUG
            printf("DEBUG2 %d",account_number);
            printf("DEBUG3 %d",account_pn);
            attempts++;
        }
        else{
            printf("\nCONGRATS\n");
            attempts=3;
        }
    }

    return 0;
}

int check_login(int rand_account[], int account[]){
    int index,number;

    //check user account number and pin number with random generation
    for(index=0;index<5;index++){
        if(account[index]==rand_account[index]){
            number=1;
        }
        else{
            number = 2;
            break;
        }
    }
    return number;
}

int check_login_pin(int rand_pin[], int pin[]){
    int index, number;
    for(index=0;index<4;index++){
        if(pin[index]==rand_pin[index]){
            number=1;
        }
        else{
            number = 2;
            break;
        }
    }
    return number;

}

最佳答案

问题的答案是首先修复帐号和 pin 的数组大小,以包含 '\0' 空终止字符,正如 @Jonathan Leffler 所指出的。其次,另一个问题是让 if 语句运行第二个输入和打印阶段,而它应该只是将 while 循环推到第二次迭代,从而允许新输入通过,正如 @kaylum 指出的那样。感谢大家在数组和数据存储方面的帮助和建议!

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int check_login(int rand_account[], int account[]);
int check_login_pin(int rand_pin[], int pin[]);

int main(void) {

    char account_nmb[6],account_pin[5];
    int i,e,x,y,a,b,attempts=0,rand_pin[5], rand_account_number[6], account_nmb_int[6],account_pin_int[5];
    int d,f,account_number,account_pn;
    time_t t;

    srand((unsigned) time(&t));

    //generate array of rand account numbers and pin numbers
    for(x=0;x<5;x++){
        rand_account_number[x]=rand()%9;
    }
    for(y=0;y<4;y++){
        rand_pin[y]=rand()%9;
    }

    //print array of rand account numbers and pin numbers
    printf("Account Number: ");
    for(a=0;a<5;a++){
        printf("%d",rand_account_number[a]);
    }
    printf("\n");
    printf("PIN: ");
    for(b=0;b<4;b++){
        printf("%d",rand_pin[b]);
    }
    printf("\n");


    //Check User's input for match with random account number and pin
    while(attempts!=3){
        //Take user's input
        printf("Please Enter account Number: ");
        scanf(" %s", account_nmb);
        for (i = 0; i < 5; i++ ) {
            account_nmb_int[i] = account_nmb[i] - '0';
        }
        printf("Please Enter account PIN: ");
        scanf(" %s", account_pin);
        for (e = 0; e < 4; e++ ) {
            account_pin_int[e] = account_pin[e] - '0';
        }

        //DEBUG
        printf("Account Number DEBUG: ");
        for(d=0;d<5;d++){
            printf("%d",account_nmb_int[d]);
        }
        printf("Account PIN DEBUG: ");
        for(f=0;f<4;f++){
            printf("%d",account_pin_int[f]);
        }


        account_number=check_login(rand_account_number, account_nmb_int);
        account_pn=check_login_pin(rand_pin,account_pin_int);

        //DEBUG
        printf("\nACCNT%d",account_number);
        printf("\nPIN%d\n",account_pn);

        if(account_number==2||account_pn==2){
            attempts++;
        }
        else{
            printf("\nCONGRATS\n");
            attempts=3;
        }
    }

    return 0;
}

int check_login(int rand_account[], int account[]){
    int index,number=1;

    //check user account number and pin number with random generation
    for(index=0;index<5;index++){
        if(account[index]==rand_account[index]){
            number=1;
        }
        else{
            number = 2;
            break;
        }
    }
    return number;
}


int check_login_pin(int rand_pin[], int pin[]){
    int index, number=1;
    for(index=0;index<4;index++){
        if(pin[index]==rand_pin[index]){
            number=1;
        }
        else{
            number = 2;
            break;
        }
    }
    return number;

}

关于有人可以向我解释 scanf 如何使用 C 处理多个输入 session 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33749210/

相关文章:

c - 在 c 中使用 Shmget() 和结构体

c - 为什么 char * malloc 给我一个 scanf 的段错误?

scanf 可以识别字符串中的格式字符吗?

c - 需要 char* 但实际是 char(*) [20]

c - 如何创建这种类型的链表

根据用户输入的字符创建一个矩形

c - C 中的有符号到无符号转换 - 它总是安全的吗?

python - 使用 TensorArray 的梯度错误

linux - 虽然 shell 脚本中的循环说 [ : too many arguments

python - While 循环的问题