Générateur de code aléatoire.

Aiden Pearce Messages postés 53 Statut Membre -  
[Dal] Messages postés 6373 Statut Contributeur -
Salut tout le monde,
est-ce que quelqu'un pourrait me procurer un code source en langage C qui pourrait générer un code aléatoire de 8 chiffres en m'expliquant comment ça marche ?
Je sais ce que vous penserez mais c'est parce que je ne comprends rien du tout et j'ai besoin de ce code source!
Merci !
A voir également:

2 réponses

Chris 94 Messages postés 58330 Date d'inscription   Statut Modérateur Dernière intervention   7 348
 
Salut,

Hum !

Il y a comme un relent d'exercice, de devoir... Sinon, effectivement, on pense :-/
0
juliencolin54 Messages postés 238 Statut Membre 55
 
Bonjour,

Voici pour toi, j'ai commenté pour que tu comprennes mieux.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

/*
** Retourne une chaîne random :
** - lenStr : taille de la chaine retournee
** - tabChars : caractères utilisé pour le random
*/
char *randomString(int lenStr, char *tabChars)
{
char *str;
int i;
int lenTabChars;

lenTabChars = strlen(tabChars);
// Malloc de la chaine de caractère (8 + 1) cases
str = malloc((lenStr + 1) * sizeof(char));
for (i = 0; i < lenStr; i++) {
str[i] = tabChars[(rand() % lenTabChars)];
/*
** Chaque case de la chaine équivaut à tabChars[NOMBRE_RANDOM % 10]
** ie une case de tabChars au hasard
}
return (str);
}

int main(int ac, char **av)
{
srand(time(0)); // Inialisation du random
printf("%s\n", randomString(8, "0123456789"));
return (0);
}


Cdlt,
0
[Dal] Messages postés 6373 Statut Contributeur 1 106
 
Salut Julien,

C'est malin de procéder comme cela.

Deux remarques :

Il faut terminer la chaîne après la boucle for, avec
str[lenStr] = '\0';
, selon ma compréhension.

En C, je pense que la façon adéquate de renvoyer une chaîne avec une fonction n'est pas return, mais l'utilisation d'un chaîne passée en paramètre. Donc, ajouter un 3ème paramètre à ta fonction afin que l'espace mémoire dans lequel se trouve le résultat persiste. Là, dans ton implémentation, la mémoire pointée par str n'est allouée que pendant l'exécution de la fonction randomString. Après, tu n'as aucune garantie que cet espace mémoire ne soit pas occupé par autre chose, réclamé par un autre processus, etc. Laisse à la fonction appelante le soin d'allouer l'espace mémoire dans lequel randomString va stocker le résultat. Il sera de la responsabilité de la fonction appelante de libérer cet espace ou d'en faire ce que bon lui semble.


Dal
0
[Dal] Messages postés 6373 Statut Contributeur 1 106
 
Aussi, en principe, cela devrait aussi être NULL que l'on passe à time, car la fonction attend un pointeur de type time_t. Bien sûr NULL va être substitué par 0 par le préprocesseur, mais, NULL dit mieux ce dont il s'agit : un pointeur sans cible.
0
juliencolin54 Messages postés 238 Statut Membre 55
 
En effet, j'ai repris un ancien code et j'ai supprimé le '\0' final par négligence.
Pour toutes tes autres remarques, c'est vrai et mieux de faire comme tu dis.

Mais j'ai pas envie de m'embêter à poster un code "nickel" à chacun de mes post, tant que la question est bien traitée.
Par exemple je préfère mettre 0 au lieu de NULL car je gagne 3 caractères.
(Énorme économie, n'est-ce pas ?)
0
[Dal] Messages postés 6373 Statut Contributeur 1 106
 
juliencolin54:

lol @ "économie"

plus sérieusement, comme une grande majorité des personnes posant des questions ici sont des gens qui se forment au langage C, et que les posts sur les forums CCM sont bien référencés par les moteurs de recherche, je crois qu'au contraire on devrait avoir le souci de poster un code aussi rigoureux et exact que possible (dès lors qu'on poste un code)

comme on n'est pas parfait, mais qu'on est une communauté, le peer-review joue aussi et permet à la fois d'améliorer la qualité des contributions et de faire progresser tout le monde, et pas seulement les personnes qui postent les questions.

Aiden Pearce:

En reprenant le code astucieux de Julien, et en y appliquant les modifications proposées ci-dessus (ici et ), cela serait bien que tu nous postes le code final en répondant à ton propre sujet.

Ainsi, on saura si tu as compris (on ne va pas tout faire pour toi tout de même), et on aura un code propre à proposer en réponse à ta question dans ce fil.


Dal
0
fiddy Messages postés 11653 Statut Contributeur 1 847
 
@Julien,

Pour gagner encore 2 caractères : return 0; au lieu de return (0); Eh oui, return n'est pas une fonction :-)
0