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

Could someone explain to me how scanf works with multiple input sessions with C?

在任何人咆哮之前,我知道编码很丑陋并且可能很乏味地完成所有变量,但只有 for 循环,所以不要让那些打扰你。问题是,我必须接受用户的输入,即:帐号和帐号密码,并根据随机帐号和随机密码生成的内容检查他们是否输入了正确的密码和帐号。我检查帐号和帐户密码的功能可以正常工作,没有问题。我在那里有一些 DEBUG 语句来尝试找出问题发生的地方。我注意到 while 循环中出现的问题,如果用户在第一次尝试时错误地输入帐号或 PIN 码,它会循环回来并再次询问,但是当它再次询问用户第二次输入信息时尝试,带有用户新信息的数组不存储新信息,而是仍然传递来自原始尝试的旧信息。 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 的数组大小,以包含 @Jonathan Leffler 指出的 '\0' 空终止符。其次,另一个问题是 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;

}