Partage
  • Partager sur Facebook
  • Partager sur Twitter

Random : valeurs fausses

Random

    16 janvier 2022 à 11:12:39

    Bonjour à tous,

    Je fais un programme de générateur de mot de passe personnalisable et j'ai un pb sur mes randoms : ils renvoient des caractères qui ne sont pas compris dans mes bornes !

    Le code :

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int generateur(int carac, int minu, int maju)
    {
        int taille = carac + minu + maju;
        int icarac, iminu, imaju;
        char mdp[taille];
        int randome;
        srand(time(NULL));
    
        // Boucle des caracteres spéciaux
        for (int i = 0; i < taille; i++)
        {
            randome = rand()%3;
    
            if (randome == 0)
            {
                if (icarac < carac)
                {
                    mdp[i] = rand()%((64 - 33 + 1) + 33);
                    icarac++;
                }
                else
                {
                    ;
                }
    
            if (randome == 1)
            {
                if (iminu < minu)
                {
                    mdp[i] = rand()%((90 - 65 + 1) + 65);
                    iminu++;
                }
                else
                {
                    ;
                }
            if (randome == 2)
            {
                if (imaju < maju)
                {
                    mdp[i] = rand()%((97 - 122 + 1) + 97);
                    imaju++;
                }
                else
                {
                    ;
                }
            }
            }
            }
        }
    
    
    
        // Affichage du mot de passe
        printf("\n");
        printf("Votre mot de passe est desormais :\n");
        for (int i = 0; i < taille; i++)
        {
            printf("%c", mdp[i]);
        }
    
    }
    
    int main()
    {
        int nbchar;
        int nbminu;
        int nbmaju;
        srand(time(NULL));
        printf("Bienvenue dans le createur de mot de passe !\n");
        printf("Choisir le nombre de caracteres du mdp :\n");
        scanf("%d", &nbchar);
        fflush(stdin);
        printf("Choisir le nombre de minuscules du mdp :\n");
        scanf("%d", &nbminu);
        fflush(stdin);
        printf("Choisir le nombre de majuscules du mdp :\n");
        scanf("%d", &nbmaju);
        fflush(stdin);
        generateur(nbchar, nbminu, nbmaju);
    }

    • Partager sur Facebook
    • Partager sur Twitter
      16 janvier 2022 à 11:33:25

      Tu as des rand avec tout un tas de valeur magique que l'on ne sait pas d'où elles sortent, mais qui a coup sur ne donneront pas ce que tu souhaites !

      Ton mot de passe à une taille de carac + minu + maju. minu et maju on se doute de ce que c'est mais carac, c'est quoi ?

      PS : on appelle srand qu'une seule fois lors de l’exécution du programme !

      -
      Edité par rouIoude 16 janvier 2022 à 11:34:56

      • Partager sur Facebook
      • Partager sur Twitter
      ...
        16 janvier 2022 à 12:38:34

        J'ai modifié mon code, je l'ai rendu un peu plus simple, mais toujours des valeurs qui sortent du tableau ASCII :

        #include <stdio.h>
        #include <stdlib.h>
        #include <time.h>
        
        int generateur(int taille)
        {
            char mdp[taille];
        
            // On va d'abord mélanger le tableau, faire apparaitre des valeurs randoms dedans entre 0 et 2 (0, 1, 2)
        
            for (int i = 0; i < taille; i++)
            {
                mdp[i] = rand()%3;
            }
        
            // On va suivre le "path" du tableau char: si 0 = caractère, si 1 = minuscule, si 2 = majuscule
        
            for (int j = 0; j < taille; j++)
            {
                if (mdp[j] == 0)
                {
                    mdp[j] = rand()%('@' -'!' + 1) + '!' ;
                }
                if (mdp[j] == 1)
                {
                    mdp[j] = rand()%('z' - 'a' + 1) + 'a';
                }
                if (mdp[j] == 2)
                {
                    mdp[j] = rand()%(('Z' - 'A' + 1) + 'A');
                }
        
            }
            // Affichage du mot de passe
            printf("\n");
            printf("Votre mot de passe est desormais :\n");
            for (int k = 0; k < taille; k++)
            {
                printf("%c", mdp[k]);
            }
        
        
        }
        
        int main()
        {
            int taille;
            srand(time(NULL));
            printf("Bienvenue dans le createur de mot de passe !\n");
            printf("Choisir la taille du mdp :\n");
            scanf("%d", &taille);
            fflush(stdin);
            generateur(taille);
        }
        



        -
        Edité par Clément 2910 16 janvier 2022 à 12:45:33

        • Partager sur Facebook
        • Partager sur Twitter
          16 janvier 2022 à 13:58:54

          Ok, donc tu as du remarquer qu'avec ton nouveau code ça semble fonctionner pour les minuscules et les caractères spéciaux mais pas pour les majuscules ?!

          Si tu compares le code qui calcule une minuscule et celui qui calcule une majuscule, tu remarquera une différence notable !  (notamment au niveau des parenthèses).  

          • Partager sur Facebook
          • Partager sur Twitter
          ...
            16 janvier 2022 à 18:23:47

            Un tableau de char ça peut devenir une chaîne de caractères si on réserve un espace de plus et si on termine par le caractère '\0'
            Tu pourrait tout afficher avec un seul  printf("%s", mdp);
            Le fflush peut ne pas fonctionner correctement sur certains systèmes. Fais plutôt:
                while(getchar() != '\n');   // et rien d'autre.
            Petite suggestion: pourquoi ne pas ajouter les chiffres?
            • Partager sur Facebook
            • Partager sur Twitter

            Le Tout est souvent plus grand que la somme de ses parties.

            Random : valeurs fausses

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown