Générateur de code aléatoire.

Fermé
Aiden Pearce Messages postés 48 Date d'inscription dimanche 22 septembre 2013 Statut Membre Dernière intervention 25 septembre 2013 - 22 sept. 2013 à 00:45
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 - 27 sept. 2013 à 10:30
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 50978 Date d'inscription mardi 8 janvier 2008 Statut Modérateur Dernière intervention 17 février 2023 7 341
25 sept. 2013 à 17:26
Salut,

Hum !

Il y a comme un relent d'exercice, de devoir... Sinon, effectivement, on pense :-/
0
juliencolin54 Messages postés 217 Date d'inscription dimanche 22 juillet 2012 Statut Membre Dernière intervention 1 octobre 2013 55
26 sept. 2013 à 08:51
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 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié par [Dal] le 26/09/2013 à 16:10
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 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
26 sept. 2013 à 16:18
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 217 Date d'inscription dimanche 22 juillet 2012 Statut Membre Dernière intervention 1 octobre 2013 55
26 sept. 2013 à 16:49
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 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
26 sept. 2013 à 17:28
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 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
Modifié par fiddy le 26/09/2013 à 23:08
@Julien,

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