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![]()
merci
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![]()
merci
printf c'est dans stdio.h ... edite ce fichier et tu auras le code ...
Karuto
MCSA, MSCE (Win2K), MCDBA (SQL 2K)
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![]()
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
?
:
_*----|OtAkU|----*_
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 variable
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 i = 15; printf("\ni = %d\n", i);
voila, le problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part "\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 : 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 #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![]()
le code que tu m'as donné est exactement ce dont j'avais besoin![]()
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager