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 :

Comment faire une boucle FOR pour incrémenter des caractères..?


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 46
    Points : 15
    Points
    15
    Par défaut Comment faire une boucle FOR pour incrémenter des caractères..?
    Bonjour à tous,

    J'aurais besoin de votre aide car je n'arrive pas à faire une incrémentation d'une chaine de caractères.

    Voilà le problème :
    On doit retrouver (obligatoirement avec 8 threads) un mot (de 5 caractères) contenu dans un fichier texte.
    On donne au départ un alphabet de 10 lettres qui sont utilisées dans le mot et chaque thread doit tester une partie des combinaisons possibles.
    Comme on a un alphabet de 10 lettres et que le mot en fait 5, il y a 10^5 possibilités.

    Admettons que le mot recherché soit "clair".
    Le programme doit tester toutes les combinaisons possibles et retrouver le mot.
    Donc il commence par "aaaaa", puis "aaaab", etc.., jusqu'à "claiq", puis "clair".

    Voilà le code auquel on a pensé :

    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
                //Variables globales//
                int nb_lettres_alphabet;
                char combinaison[int nb_lettres_alphabet];
                int taille_mdp;
                int nb_threads;
     
                    //Fonctions//
     
        char thread1 (char combinaison[])
        {
            mdp = fopen (mdp.txt, 'r');
            const char val_debut = "aaaaa";
            const char val_fin  = "ccccc";
            char i;
            for (i = val_debut ; i < val_fin ; i++) //Le problème est au niveau des conditions de la boucle "for" 
            {
                if (mdp == combinaison[i])
                    {
                        pthread_cancel (thread2);
                        pthread_cancel (thread3);
                        pthread_cancel (thread4);
                        pthread_cancel (thread5);
                        pthread_cancel (thread6);
                        pthread_cancel (thread7);
                        pthread_cancel (thread8);
                        printf ("Le mot recherché est: ");
                        printf (combinaison[i]);
                    }
            }
                   return(combinaison[i]);
        }
    Est-ce qu'on est sur la bonne voie?
    Merci à tous pour votre aide

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Dans la table ascii les lettres minuscules et majuscules sont dans l'ordre croissant

    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
        char current_str[5]  = "aaaaa";
        char searched_str[5] = "clair";
     
        unsigned char limit = 'r', is_not_equal;
     
        do {
            is_not_equal = ((current_str[0] != searched_str[0]) || (current_str[1] != searched_str[1]) || (current_str[2] != searched_str[2]) || (current_str[3] != searched_str[3]) || (current_str[4] != searched_str[4]));
     
            printf("%s\n", current_str);
     
            ++current_str[4];
     
            if (current_str[4] > limit) {
                current_str[4] = 'a';
                ++current_str[3];
     
                if (current_str[3] > limit) {
                    current_str[3] = 'a';
                    ++current_str[2];
     
                    if (current_str[2] > limit) {
                        current_str[2] = 'a';
                        ++current_str[1];
     
                        if (current_str[1] > limit) {
                            current_str[1] = 'a';
                            ++current_str[0];
     
                            if (current_str[0] > limit) {
                                current_str[0] = 'a';
     
                                is_not_equal = 0; // quit
                            }
                        }
                    }
                }
            }
        } while (is_not_equal);

  3. #3
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Avec un alphabet de 10 lettres tu es en fait en numérotation de base 10; tu peux donc utiliser simplement un int dans ta boucle for qui sera traduisible en chaîne de caractère (ex: 1234 = "bcde" si l'alphabet est constitué des 10 premières lettres de l'alphabet dans l'ordre). Cela simplifiera grandement ton programme.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par stendhal666 Voir le message
    tu peux donc utiliser simplement un int dans ta boucle for qui sera traduisible en chaîne de caractère (ex: 1234 = "bcde"
    Le problème de ta solution , c'est de devoir séparer tous les chiffres pour pourvoir faire les conversions ton entier <-> ta chaîne réelle.

    Alors que même si c'est assez pénible, simplement tu peux savoir la longueur de ta chaîne et via des while modifier ta chaîne (ou bien si tes chaînes sont petites de façon bourrin avec des if imbriqués comme je l'ai fait )

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 46
    Points : 15
    Points
    15
    Par défaut Comment faire une boucle FOR pour incrémenter des caractères..?
    Bonjour,

    Merci beaucoup pour vos réponses. J'avais également une question Foetus concernant ton code. Je comprends ce que tu as fait mais j'ai l'impression que tu fais les tests dans un seul thread. Le but pour nous est de répartir toutes les combinaisons possibles dans 8 threads. Dans ce cas-là, il suffirait juste pour moi de modifier les tableaux "current_str" et "searched_str"? Car si j'ai bien compris tu testes tout d'un coup à travers quatre boucles if.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Oui c'est mono-threadé parce que rendre l'algo multi-threadé c'est ton travail

    Par exemple tu pourrais calculer le nombre de combinaisons et le diviser par le nombre de thread.

    C'était juste pour te montrer que les caractères ASCII majuscules et minuscules sont triés dans l'ordre croissant et qu'on peut manipuler un caractère comme un nombre (avec +1 +2 +3 ... ou -1 -2 -3 ...)
    Et ensuite, comme une chaîne de caractères ASCII, c'est un tableau de caractères (avec le fameux '\0' final) c'est relativement simple pour accéder à un caractère en particulier. Il faut juste faire attention à la longueur de ta chaîne.

  7. #7
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par foetus Voir le message
    Le problème de ta solution , c'est de devoir séparer tous les chiffres pour pourvoir faire les conversions ton entier <-> ta chaîne réelle.

    Alors que même si c'est assez pénible, simplement tu peux savoir la longueur de ta chaîne et via des while modifier ta chaîne (ou bien si tes chaînes sont petites de façon bourrin avec des if imbriqués comme je l'ai fait )
    Mais non, c'est beaucoup plus simple que ça! tu traduis une seule fois la chaîne recherchée en un int, tu recherches l'int en question avec tes threads en attribuant à chacun un intervalle de (10^TAILLE_DU_MOT-1)/NB_THREADS et tu retraduis une seule fois le résultat en chaîne de caractère.

    sachant que les fonctions de conversion ne sont pas bien compliquées...

    EDIT / PS: c'est un exercice de cours - en choisissant un alphabet de 10 lettres ça m'étonnerait que le prof ait pas en tête la ressemblance avec la numérotation décimale...

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 46
    Points : 15
    Points
    15
    Par défaut Comment faire une boucle FOR pour incrémenter des caractères..?
    Ok je vais prendre en considération ce que vous m'avez dit. Merci pour vos réponses . Juste une dernière question, pour faire un multi-thread, il me suffira juste de modifier la limite de "searched_str"? Vu que par exemple le thread n°1 va tester toutes les combinaisons possibles de "aaaaa" à "ccccc". Puis le thread n°2 testera de "ccccc" à "ggggg" par exemple vu que le mot de passe fait 5 caractères. Après je suis d'accord pour le calcul des possibilités. Il y a une fonction qui va s'occuper de faire ce calcul. Mais ça sera (10^5)/8, ça va faire 12500, car l'alphabet nous sera fixé, il sera de 10 lettres (à nous de les choisir), le mdp fera forcément 5 caractères et on utilisera 8 threads.

    P.S: Désolé si je demande peut-être plusieurs fois la même chose, vous avez sûrement remarqué que je rame un peu ^^'.

  9. #9
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Ben oui, voilà:
    thread1 = combinaisons de 0 à 12499
    thread2 = de 12500 à 24999
    etc.

    C'est pour ça que la conversion str en int est obligatoire de toute façon puisque tu donneras comme base de départ à un thread pour ainsi dire "aaaaa" + no_du_thread * 12500

    Tu as donc bien besoin d'un str_to_int et d'un int_to_str dans le genre:

    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
    const char* alphabet = "abcdefghij"; // alphabet de 10 lettres
     
    int int_value(char c, const char* alphabet) {
      const char* cur = alphabet;
      for (; *cur; ++cur) 
        if (*cur == c) return cur - alphabet;
      return -1;
    }
     
     
    int str_to_int(const char* mdp) {
      int res = 0; 
      for (; *mdp; res*=10)
        res+=int_value(*mdp++, alphabet);
      return res/10;
    }
     
    void int_to_str(char* buf, int nb, int len) {
      int i;
      for (i = len; i-- > 0; nb /= 10)
        *(buf+i) = *(alphabet+nb%10);
      buf[len] = '\0';
    }
    PS: c'est bien de ramer, ça fait les muscles

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 46
    Points : 15
    Points
    15
    Par défaut Comment faire une boucle FOR pour incrémenter des caractères..?
    Ok donc si j'ai bien compris, le code que tu m'as gentiment montré avec les deux fonctions "str_to_int" et "int_to_str" me serviront à associer un numéro de combinaison à une combinaison de lettres? Je préfère être sûr avant de commencer. Cela ne concerne pas la comparaison des combinaisons avec le mot de passe contenu dans le fichier? Aurais-je besoin de définir 8 fois les fonctions de conversion "str_to_int" et "int_to_str" pour les associer à chaque thread en les adaptant à chaque fois ou est-ce qu'une fois suffira?

    P.S: Comme tu peux le voir, je rame tellement que je vais finir bodybuildé .

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 46
    Points : 15
    Points
    15
    Par défaut Comment faire une boucle FOR pour incrémenter des caractères..?
    J'ai un autre problème et celui-ci n'est pas lié au codage. Lorsque je veux exécuter le programme et donc passer sur la console, cette dernière crash et je suis obligé de la fermer. Le truc c'est que si je mets le thread en commentaire, le programme s'exécute parfaitement et je peux donc voir que mon fichier contenant le mdp a bien été ouvert. C'est juste lorsque je fais l'appel du thread et que j'exécute que ça plante. J'ai testé sur deux ordis différents, avec 1 à 8Go de RAM. J'ai même testé avec un autre logiciel, le problème persiste. Je ne comprends rien à ce qu'il se passe...

  12. #12
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Ok donc si j'ai bien compris, le code que tu m'as gentiment montré avec les deux fonctions "str_to_int" et "int_to_str" me serviront à associer un numéro de combinaison à une combinaison de lettres?
    Oui, mais plus qu'associer: le int et la string sont équivalents, ils sont tous les deux en base 10. Si comme alphabet tu choisissais "0123456789" ton mot de passe serait un entier.

    Cela ne concerne pas la comparaison des combinaisons avec le mot de passe contenu dans le fichier?
    Tu auras besoin de tout cela pour lancer les threads, pour leur donner les bornes de ce qu'ils doivent tester, quels que soient tes choix par ailleurs. Mais tu peux aussi t'en servir pour rechercher le mot de passe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int imdp = str_to_int(mdp);
    for (i = low to high) if i == imdp trouvé!;
    cela revient au même que d'incrémenter la chaîne test et de la comparer au mot de passe sous forme de string

    Aurais-je besoin de définir 8 fois les fonctions de conversion "str_to_int" et "int_to_str" pour les associer à chaque thread en les adaptant à chaque fois ou est-ce qu'une fois suffira?
    une fois suffira. Tout dépend de ta librairie de threads mais tu auras qqc dans le genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    thread* new_thread(void* (*) (void*), void* arg);
    tu vas écrire une fonction avec la signature (void* () (void*) et qui va faire le travaille d'analyse, la même pour tous les threads, et tu donneras son adresse à new_thread à chaque fois que tu en créeras un, mais avec un argument différent.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 46
    Points : 15
    Points
    15
    Par défaut Comment faire une boucle FOR pour incrémenter des caractères..?
    Voici où j'en suis actuellement (je n'ai pas encore fait l'appel des fonctions dans le main), pour l'instant je veux juste tester le thread mais ce dernier fait planter la console quand je veux tester uniquement la fonction thread... Est-ce que ce qui fait planter est lié au codage? Je n'en ai aucune idée à l'heure actuelle. Serait-il possible pour vous (je ne sais pas quel logiciel vous utilisez, pour ma part j'utilise Code Blocks) juste de copier-coller le programme afin de juste tester la fonction "thread1"? Il manque sûrement du codage, mais la console crash instantanément et du coup je ne peux pas me rendre compte de mes erreurs.

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #define TAILLE_MAX 6
     
     
    const char* alphabet = "abcdefghij"; // alphabet de 10 lettres
     
    int int_value(char c, const char* alphabet) {
      const char* cur = alphabet;
      for (; *cur; ++cur)
        if (*cur == c) return cur - alphabet;
      return -1;
    }
     
     
    int str_to_int(const char* mdp) {
      int res = 0;
      for (; *mdp; res*=10)
        res+=int_value(*mdp++, alphabet);
      return res/10;
    }
     
    void int_to_str(char* buf, int nb, int len) {
      int i;
      for (i = len; i-- > 0; nb /= 10)
        *(buf+i) = *(alphabet+nb%10);
      buf[len] = '\0';
    }
     
     
     
    void thread1()
    {
     
     
     char current_str[4]  = "aaaaa";
     char searched_str[4] = "outil";
    // char end_str[4]      = "bbbbb";
     
        unsigned char limit = 'l', is_not_equal;
     
        do {
     
     
            is_not_equal = ((current_str[0] != searched_str[0]) || (current_str[1] != searched_str[1]) || (current_str[2] != searched_str[2]) || (current_str[3] != searched_str[3]) || (current_str[4] != searched_str[4]));
            printf("%s\n", current_str);
     
     
            ++current_str[4];
     
            if (current_str[4] >= limit) {
                current_str[4] = 'a';
                ++current_str[3];
     
                if (current_str[3] >= limit) {
                    current_str[3] = 'a';
                    ++current_str[2];
     
                    if (current_str[2] >= limit) {
                        current_str[2] = 'a';
                        ++current_str[1];
     
                        if (current_str[1] >= limit) {
                            current_str[1] = 'a';
                            printf(current_str[1]);
                            ++current_str[0];
     
                            if (current_str[0] >= limit) {
                                current_str[0] = 'a';
     
                                is_not_equal = 0; // quit
                            }
                        }
                    }
                }
            }
        } while (is_not_equal);
    }
     
     
    int main()
    {
        FILE* fichier = NULL;
        char chaine[TAILLE_MAX] = ""; // Chaîne vide de taille TAILLE_MAX
     
     
        fichier = fopen("C:\\Users\\User\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Accessories\\mdp.txt", "r+");
     
     
        if (fichier != NULL)
     
        {
             fgets(chaine, TAILLE_MAX, fichier);
            // On peut lire et écrire dans le fichier
            printf("Le mot de passe contenu dans le fichier est: ");
            printf("%s", chaine,"\n"); // On affiche la chaîne
            //printf("\nLe fichier a ete ouvert sans soucis.");
     
     
            fclose(fichier);
            thread1();
            printf("\nLe mot de passe n'est pas dans ce thread");
     
        }
     
        else
     
        {
     
            // On affiche un message d'erreur si on veut
     
            printf("Impossible d'ouvrir le fichier mdp.txt");
     
        }
     
     
        return 0;
    }

  14. #14
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Je n'ai pas trop le temps. Mais je vois déjà : char str [4] = "aaaaa" alors que la taille est de 6 (5 caractères + null)...

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 46
    Points : 15
    Points
    15
    Par défaut Comment faire une boucle FOR pour incrémenter des caractères..?
    Oui désolé j'ai corrigé cette grossière erreur. Il ya déjà du mieux. La console affiche bien le déroulement des combinaisons possibles, mais plante à "a et 4 caractères ascii" alors que normalement, vu que j'ai fixé une limite à "ccccc", je voudrais que cela passe ensuite à "baaaa" puis "baaab" etc. Disons que si j'arrive à coder correctement un thread, les autres seront simples à coder dans le sens où j'aurais juste à changer le current_str et la limit. Voici mon code à l'heure actuelle:

    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
    50
    51
    52
    53
    54
     
    void thread1()
    {
     
     
     char current_str[6]  = "aaaaa";
     char searched_str[6] = "outil";
    // char end_str[4]      = "bbbbb";
     
        unsigned char limit[5] = "ccccc", is_not_equal;
     
        do {
     
     
            is_not_equal = ((current_str[0] != searched_str[0]) || (current_str[1] != searched_str[1]) || (current_str[2] != searched_str[2]) || (current_str[3] != searched_str[3]) || (current_str[4] != searched_str[4]));
            printf("%s\n", current_str);
     
     
            ++current_str[4];
     
            if (current_str[4] >= limit) {
                //Sleep(50);
                current_str[4] = 'a';
                ++current_str[3];
     
                if (current_str[3] >= limit) {
                        //Sleep(50);
                    current_str[3] = 'a';
                    ++current_str[2];
     
                    if (current_str[2] >= limit) {
                            //Sleep(50);
                        current_str[2] = 'a';
                        ++current_str[1];
     
                        if (current_str[1] >= limit) {
                                //Sleep(50);
                            current_str[1] = 'a';
                            printf(current_str[1]);
                            ++current_str[0];
     
                            if (current_str[0] >= limit) {
                                    //Sleep(50);
                                current_str[0] = 'a';
     
                                is_not_equal = 0; // quit
                            }
                        }
                    }
                }
            }
        }
            while (is_not_equal);
    }
    P.S: Je m'excuse par avance pour les grossières erreurs de codage qu'il peut y avoir, je n'ai pas fait de c depuis longtemps. J'espère juste que vous comprendrez ce que je veux faire et ce qui ne va pas .

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 46
    Points : 15
    Points
    15
    Par défaut Comment faire une boucle FOR pour incrémenter des caractères..?
    *Voici le problème dont je veux parler:

    Nom : Capture_console.PNG
Affichages : 1541
Taille : 32,0 Ko

  17. #17
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Il y a trois problèmes:

    1)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char limit[5] = "ccccc"; // encore une fois une chaîne de 6 caractères (en comptant NULL) dans un tableau de dimension inférieure...
    2)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (current_str[4] >= limit) ... // tu compares les choux et les carottes, là: un char et un tableau de char...
    3)

    il y a un problème de design à cause de la mauvaise solution proposée par foetus: comme ton mdp est "outil", ton alphabet ne peut pas être continu (il y a plus de 10 caractères d'écart entre i et u); donc l'incrémentation (+1) des caractères ne peut pas suffire à trouver la solution, tandis que celle que je proposais le permet.

  18. #18
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par stendhal666 Voir le message
    il y a un problème de design à cause de la mauvaise solution proposée par foetus: comme ton mdp est "outil", ton alphabet ne peut pas être continu (il y a plus de 10 caractères d'écart entre i et u); donc l'incrémentation (+1) des caractères ne peut pas suffire à trouver la solution, tandis que celle que je proposais le permet.
    Il y a surtout un problème avec tes préconditions que Crusy007 n'a pas respecté

    Je te cite :
    Oui, mais plus qu'associer: le int et la string sont équivalents, ils sont tous les deux en base 10. Si comme alphabet tu choisissais "0123456789" ton mot de passe serait un entier.
    Mais Crusy007 n'utilise pour l'instant que les minuscules : donc c'est plus une base 26 qu'une base 10


    Et regarde le post #6.
    Ma réponse est en rapport avec le titre qui ne parle pas de multi-threads (et ce n'est pas la bonne section non plus).

  19. #19
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Il y a surtout un problème avec tes préconditions que Crusy007 n'a pas respecté

    Je te cite :
    Oui, mais plus qu'associer: le int et la string sont équivalents, ils sont tous les deux en base 10. Si comme alphabet tu choisissais "0123456789" ton mot de passe serait un entier.
    Mais Crusy007 n'utilise pour l'instant que les minuscules : donc c'est plus une base 26 qu'une base 10
    Si j'ai bien suivi l'énoncé du problème, la seule précondition est que l'alphabet fait 10 lettres. Pour être plus clair sur l'équivalence int / string avec alphabet de 10 lettres, j'ai fait remarquer qu'une string avec l'alphabet "0123456789" s'afficherait et s'incrémenterait comme un int. Mais l'équivalence persiste même si l'alphabet est "r4[è&§P£*:" puisque chaque lettre a son rang dans la chaîne comme valeur: 0, 1, 2, 3 ... 9. "outil" peut être écrit avec 10 lettres, la seule chose qui est impossible est que les lettres se suivent -d'où la nécessité de dépasser l'incrémentation des caractères et de penser directement en base 10...

    Cela étant, mes excuses pour ce terme de "mauvaise solution" et mon ton assez péteux

  20. #20
    Membre habitué Avatar de Abacar94
    Homme Profil pro
    L2 Math-informatique
    Inscrit en
    Novembre 2015
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Niger

    Informations professionnelles :
    Activité : L2 Math-informatique

    Informations forums :
    Inscription : Novembre 2015
    Messages : 103
    Points : 133
    Points
    133
    Par défaut
    concrètement que veut tu faire ?
    1) retrouver un mot de 5 lettres partir d'une liste de 10 alphabets ?
    2) retrouver un mot de 5 lettres a l'intérieur d'un autre de 10 lettres ?

Discussions similaires

  1. comment faire une boucle for en talend
    Par didafd dans le forum Développement de jobs
    Réponses: 4
    Dernier message: 26/09/2011, 09h36
  2. Réponses: 2
    Dernier message: 15/02/2010, 01h07
  3. faire une boucle for..next sur des textbox
    Par Actarusdu60 dans le forum VB.NET
    Réponses: 1
    Dernier message: 28/11/2008, 21h51
  4. Réponses: 2
    Dernier message: 06/04/2007, 13h31

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