J'essaie de mettre en œuvre un programme simple qui lit à l'infini l'entrée de l'utilisateur, puis l'imprime. Mais il y a quelques problèmes. C'est un problème simple mais mes recherches sur Google ne m'ont apporté aucune solution. Voici le code.

int main() {

    char pass[32];
    int x=10;

    while (x!=0) {


        printf("\nInput the password: ");
        fgets(pass, sizeof(pass), stdin);

        printf("that is what i read: %s", pass);
    }
    return 0;
}

Lorsque j'entre une chaîne de plus de 32 caractères, elle se comporte de manière anormale.

Input the password: pass
that is what i read: pass

Input the password: passsssss
that is what i read: passsssss

Input the password: passssssssssssssssssssssssssssssss
that is what i read: passsssssssssssssssssssssssssss
Input the password: that is what i read: sss

Input the password:

Vous voyez dans la troisième tentative, il imprime la troisième ligne automatiquement. Je n'ai pas tapé l'entrée «c'est ce que j'ai lu: sss».

Pourquoi cela se produit-il?

c
1
Faruk D 3 juin 2020 à 05:33

2 réponses

Vous avez limité votre variable d'entrée à 32 caractères, donc pour l'empêcher de faire cela, augmentez simplement la taille de pass [32].

0
Dylan Conklin 3 juin 2020 à 02:46

La solution sûre lors de l'utilisation de fgets serait quelque chose comme ceci:

if (fgets(pass, sizeof(pass), stdin) != NULL){
    int len = strlen(pass);
    if (len > 0 && pass[len-1] != '\n'){
        int ch;
        while ((ch=getchar()) != '\n' && ch != EOF);
    }
}

Ou ca:

if (fgets(pass, sizeof(pass), stdin) != NULL){
    if (strcspn(pass, "\n") == sizeof(pass) - 1){
        int ch;
        while ((ch=getchar()) != '\n' && ch != EOF);
    }
}

Vous devez vérifier s'il y a un caractère de nouvelle ligne \n dans la chaîne, s'il n'y en a pas, alors il reste des caractères en excès dans le stdin qui doivent être effacés.

1
isrnick 3 juin 2020 à 04:14