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:
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 :)
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.
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 ^^'.
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é :).
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...
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:
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;
} |
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:
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 :).
1 pièce(s) jointe(s)
Comment faire une boucle FOR pour incrémenter des caractères..?
*Voici le problème dont je veux parler:
Pièce jointe 193796