bonjour,
est-ce que quelqu'un pourrait me dire où je pourrais trouver le code de la fonction printf :?:
je dois coder une fonction analogue et celà me faciliterai énormément la vie :lol:
merci
Version imprimable
bonjour,
est-ce que quelqu'un pourrait me dire où je pourrais trouver le code de la fonction printf :?:
je dois coder une fonction analogue et celà me faciliterai énormément la vie :lol:
merci
printf c'est dans stdio.h ... edite ce fichier et tu auras le code ...
le seul problème est que ces fonctions sont en assembleur, optimisées à fond et que les fichiers .h fournis avec les compilateurs sont plutôt illisibles.
d'ailleurs, ces fonctions sont précompilées en général :(
donc si je comprends bien, il va falloir que je me rapaluche à la main toute la fonction :evilred:
Tu a besoin de koi exactement par rapport a la fonction printf ?
=> le fait d'avoir une liste variable de param (list args ??? je crois)
=> le fait d'envoyer une chaine de caractère formatté (selon différents type de données) sur stdout
?
:?:
bon, je vais essayer d'être clair (c'est assez capilotracté !!)
il faut que j'écrive un simulateur d'un micro qui est programmé en C.
dans le code du programme que je dois simuler, il y a des printf qui affichent des messages sur un écran (logique)
les printfs permettent d'utiliser aussi des caractères de controles (\n \t...) et des remplaçements de variables (%d %c...)
ce que je veux faire, c'est récupérer la chaine de caractères générée par le printf, sans qu'il ait interprété les caractères de controles...
un exemple sera plus simple je pense
j'ai
je veux récupérer comme chaine dans une variableCode:
1
2 i = 15; printf("\ni = %d\n", i);
voila, le problème.Code:"\ni = 15\n"
pour le résoudre je pense à la solution suivante
- dérouter systématiquement le printf vers une autre fonction par un define
#define printf PRINTF
- dans ce PRINTF, transformer la chaine à formatter "\ni = %d\n" en "\\ni = %d\\n"
- exécuter un fprintf vers un fichier avec la nouvelle chaine formatté
- récupérer la chaine dans le fichier
- et virer les éventuels \\ (je ne sais pas s'ils seront doublés à l'écriture ??)
je pense que c'est bien compliqué, mais pour l'instant je n'ai rien d'autre...
donc si vous avez des idées, elles sont les bienvenues.
merci
J'ai deja fait un truc dans le genre...
voila ce que je te propose:
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 #include <stdio.h> // pour printf() #include <ctype.h> // pour iscntrl() #include <stdarg.h> // pour va_start(), va_end(), va_list ,... /*----------------------------------------------*/ /* Effectue un printf normal sur stdout */ /* puis recopie la chaine dans le fichier en */ /* parametre (sans les caracteres de controle) */ /*----------------------------------------------*/ int myPrintf (FILE* output, char *format ,...) { va_list liste; char *new_format; int i,j; int size; size = strlen(format); // On compte le nombre de caractere de controle for (size=0, i=size; i>=0; i--) if (iscntrl(format[i])) size++; size +1; // '\0' // On alloue le nouveau format new_format = (char*) malloc (sizeof(char) * size); // On recopie la chaine en modifiant les controles for (i=0, j=0; i<strlen(format); i++,j++) { switch (format[i]) { case '\n': new_format[j++] = '\\'; new_format[j] = 'n'; break; case '\t': new_format[j++] = '\\'; new_format[j] = 't'; break; /* etc... pour les autres controles */ default: /* ici on gere tous les autres caracteres */ new_format[j] = format[i]; } } new_format[j] = '\0'; // On alloue la chaine qui contiendra le resultat size = strlen(new_format)+1; va_start(liste,format); // on charge la liste d'arguments /*- on ecrit dans le fichier avec la nouvelle chaine -*/ vfprintf (output, new_format, liste); /*- on ecrit sur stdout avec la chaine normal -*/ size = vprintf (format, liste); va_end(liste); // on referme la liste d'arguments free (new_format); return size; } main () { myPrintf (stdout, "\ni = %d\n", 15); }
normalement ca devrait marcher
Si tu as du mal avec le C hésite pas à lire les tutoriels et cours de formation pour apprendre la programmation en langage C : http://c.developpez.com/cours/
super je te remercie :D
le code que tu m'as donné est exactement ce dont j'avais besoin :applo: