IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

chaine de caracteres aleatoire dans un ficher


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 46
    Par défaut chaine de caracteres aleatoire dans un ficher
    bon voila ,pour mon projet je cherche a générer une chaine de caractère dans un fichier ,majuscule,minuscule,symbole,numero .....
    mais le probleme c'est que je ne veux pas avoir de repetition dans ma chaine comme AfrAdcd mais plutot Ghjek23




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    #include<stdio.h>
    #include<stdlib.h>
     
    void key_crypt()
    {
    char key[156],c,car;
    FILE *f;
    int i,verif;
     
    f=fopen("/home/moktar/Desktop/Projet stage/Key_crypt.txt","a");
    if(f==NULL)
    {printf("erreur");exit(0);}
     
     
     
    for(i=0;i<156;i++)
    {
    do
      {
      c=rand() % '~';
      }
      while( !( '!'<=c && c<='~' )  );
     
    if (f==NULL)
    fprintf(f,"%c",c);
     
    else
    {
    rewind(f);
    while(!feof(f))
    {fscanf(f,"%c",car);
    if (car==c)
    verif==1;
    }
    }
    if (verif=1)
    i--;
    else
    fprintf(f,"%c",c);
    }
    fclose(f);
    }
     
     
    int main()
    {
        key_crypt();
       return 0;
    }
    au debut je crée un fichier,apres avec rand je génère un caratcere, si le fichier est vide je l'écrit dans le fichier ,sinon je le compare avec les caractère dans le fichier,si il y a des repetitions dans ce cas il faut générer un autre caractère est verif=1 ===> i--.
    je dois avoir a la fin 156 caractère différent

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par mathiew Voir le message
    je dois avoir a la fin 156 caractère différent
    156 caractères différents en prenant comme générateur un random modulo 126 (donc 126 possibilités uniquement), tu vas avoir bien du mal je pense...

    Sinon, la solution la plus simple est de créer un tableau "ordonné" avec des valeurs adéquates, puis de le mélanger, ça t'évitera déjà d'user ton disque dur à scanner je ne sais combien de fois le fichier.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Je n'ai pas analysé ton programme. Juste un truc, au passage :
    while( !( '!'<=c && c<='~' ) );
    Ce genre de chose est source de bugs.
    La norme C nous assure que seuls les caractères correspondant aux chiffres sont dans l'ordre et contigus : la valeur des caractères compris entre '1' et '9' est augmentée de 1 par rapport à celle du caractère qui précède. Par exemple, les expressions suivantes sont toujours vraies :
    '1' > '0'
    ('0'+1) == '1'
    '2' > '1'
    '0' < '9'
    ('9' - '0') == 9
    ('2'+4) != 8
    etc...

    Pour tester les autres caractères (autres que les chiffres), il faut s'y prendre autrement.

    Sinon, je n'ai pas compris ce que tu veux faire exactement, à vrai dire. Sois plus clair.

  4. #4
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 46
    Par défaut
    on va faire plus simple ,ce code génere des caracteres aleatoire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    #include <stdio.h>
    #include <stdlib.h>
     
     
    void RandomString(char *str, size_t n)
    {
    char c;
    int i;
    for(i=0;i<n;i++)
    {
    do
    {
    c=rand() % 'z';
    }while( !(( 'A'<=c && c<='Z' ) || ( 'a'<=c && c<='z' )) );
    str[i]=c;
    }
    str[i]=0;
    }
     
    main()
    {
    srand( time(NULL) );
    char str[20];
     
    for(;;)
    {
    RandomString(str,(sizeof str)-1);
    puts(str);
    fflush(stdout);
    getchar();
    }
     
    return 0;
    }

    comment le modifier pour ne plus avoir de repetiton?

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Cela n'a pas de sens.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while( !(( 'A'<=c && c<='Z' ) || ( 'a'<=c && c<='z' )) );
    Relire #3.

    Explique clairement ce que tu veux faire. C'est le flou total.

  6. #6
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Je crois serieusement que tu te casse la tete pour rien.
    Quant tu ne sais meme plus ce que tu doi faire, je te conseille de mettre ton morceau de code de cote et de repartir de zero, en analysant mieux. Cela veut dire "diviser ton probleme complexe en d'autre probleme que tu pourrai resoudre".

    Pour en revenir a ton probleme, Mac LAK t'as deja donnée une tres bonne piste !

    Je vais te donner un pseudo algorithme : il se chargera de faire ce que tu veux mais de 'a' à 'z'. A toi de l'adapter et de revenir si tu as des probleme.

    Tout dabord définition de deux tableaux statique pour ne pas se casser la tete.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    
    char LettreOrdonne [26];
    char ResultatFinal[26];
    int nombreDeCaractere = 26;
    
    Ensuite, initialisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    
    char c;
    for (c = 'a' ; (LettreOrdonne[c - 'a'] = c) != 'z' ; c++);
    

    Il ne reste plus qu'a piocher au hasard avec equiprobabilite une lettre et de la placer, en utilisant la belle fonction de la FAQ:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    int rand_n(int n)
    {
        int partSize   = 1 + (n == RAND_MAX ? 0 : (RAND_MAX - n) / (n + 1));
        int maxUsefull = partSize * n + (partSize - 1);
        int draw;
     
        do {
            draw = rand();
        } while (draw > maxUsefull);
     
        return draw / partSize;
    }
     
     
    /* Tant qu'il reste des caractere a placer */
    while (0 < nombreDeCaractere)
    {
        /* On choisie un caractere au hasard */
        int CaractereChoisie = rand_n (nombreDeCaractere);
     
        /* On place ce caractere dans le tableau */
        ResultatFinal[26 - nombreDeCaractere] = LettreOrdonne [CaractereChoisie];
     
        /* On MAJ les variables */
     
        /* Il faut decaler touts les caractere vers la gauche afin de supprimer celui que l'on vient de prendre */
        int j;
        for (j = CaractereChoisie+1 ; j<nombreDeCaractere ; j++)
            LettreOrdonne [j] = LettreOrdonne [j+1];
     
        /* On MAJ encore */
        CaractereChoisie--;
    }
    Voila, je n'ai pas tester et je l'ai ecrit rapidement, mais il devrait te donner le fil rouge afin que tu puisse resoudre ton probleme. Si tes caractere ne sont pas contigue, mon initialisation ne marchera pas, il faudra que tu la refasse.

    Bon courage a toi.

    Si tu ne comprend pas la logique du code, ou si tu as un probleme, tu sais quoi faire ^^

Discussions similaires

  1. Réponses: 4
    Dernier message: 11/11/2010, 22h47
  2. Réponses: 5
    Dernier message: 01/08/2010, 09h07
  3. [SQL] Creation d'une chaine de caractere aleatoire.
    Par Shakta dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 21/01/2008, 16h25
  4. recuperer une chaine de caractere aleatoire
    Par ajupa dans le forum Général Python
    Réponses: 2
    Dernier message: 20/12/2007, 19h24
  5. Réponses: 11
    Dernier message: 05/11/2007, 14h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo