cybkiller Un clavier AZERTY en vaut deux | Bonjour à tous ! Dans un but didactique, j'essaie de recoder la fonction printf(). Lors de l’exécution de mon programme (cf ci dessous) j'ai l'erreur suivante : "Bad Format". Le programme s'organise comme suit : myprintf.c < myprintf.h main.c < main.h Ci-dessous les sources : myprintf.h : Code :
- #ifndef __MYPRINTF_H__
- #define __MYPRINTF_H__
- #include <stdio.h>
- #include <unistd.h> //pour write()
- #include <stdarg.h>
- #include <stdlib.h>
- int myprintf(const char* format, ...);
- int myStrlen(const char* s);
- void myWrite(int fildes, const void *buf, size_t nbytes);
- #endif
|
myprintf.c Code :
- #include "myprintf.h"
- int myprintf(const char* format, ...)
- {
- int i=0;
- //char* s=NULL;
- va_list ap;
- va_start(ap, format);
-
- while(format[i] != 0)
- {
- switch(format[i])
- {
- case '%':
- switch(format[++i])
- {
- /*case 's':
- myWrite(1, s=va_arg(ap, char*), (size_t)myStrlen(s));
- break;*/
- case 'd':
- myWrite(1, va_arg(ap, int), sizeof(int));
- break;
- case 'c':
- myWrite(1, va_arg(ap, char), sizeof(char));
- break;
- default:
- myWrite(1, "%", sizeof(char));
- myWrite(1, &format[i], sizeof(char));
- }
- break;
- default :
- myWrite(1, &format[i], sizeof(char));
- }
- i++;
- }
-
- va_end(ap);
- return 0;
- }
- int myStrlen(const char* s)
- {
- int i=0;
- while(s[i] != 0)
- i++;
- return i;
- }
- /* mywrite() :
- * Fait exactement comme write, mais en s'assurant
- * que l'écriture est réussie.
- */
- void myWrite(int fildes, const void *buf, size_t nbytes)
- {
- if(buf == NULL)
- exit(1);
-
- int k;
- int n = (int)nbytes;
- int i = 0;
-
- while(i < n && (k=write(fildes, buf, nbytes)) != -1)
- {
- i = i+k;
- }
- if(k == -1)
- {
- perror("write";);
- printf("i=%d, k=%d, n=%d, filedes=%dn", i, k, n, fildes); //Bon là, je sais que je triche :P
- exit(1);
- }
- }
|
main.h : Code :
- #ifndef __MAIN_H__
- #define __MAIN_H__
- #include <stdio.h>
- #include <stdlib.h>
- #endif
|
main.c : Code :
- #include "main.h"
- #include "myprintf.h"
- int main(int argc, char* argv[])
- {
- int a=1;
- myprintf("test %d\n", a);
- return 0;
- }
|
Une exécution donne : -------------------------------------------------- $ ./myprintf test write: Bad address i=0, k=-1, n=4, filedes=1 -------------------------------------------------- Je ne suis pas du tout familier avec les fonctions va_*() c'est pour ça que je fais des essais avec ce myprintf(). Auriez-vous une idée de l'origine de l'erreur ? En vous remerciant d'avance. Message édité par cybkiller le 23-01-2012 à 14:12:57
|