Programmer la fonction c
Fermé
wakhma
Messages postés
8
Date d'inscription
jeudi 4 octobre 2012
Statut
Membre
Dernière intervention
27 octobre 2013
-
12 févr. 2013 à 15:42
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 12 févr. 2013 à 21:06
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 12 févr. 2013 à 21:06
A voir également:
- Myprintf
- Fonction si et - Guide
- Programmer sms - Guide
- Programmer mail gmail - Guide
- Fonction moyenne excel - Guide
2 réponses
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
12 févr. 2013 à 16:02
12 févr. 2013 à 16:02
Il faut distinguer i++ et ++i pour savoir dans quel ordre l'incrémentation est effectuée
switch(format[i])
{
case '%':
switch(format[++i])
ok je vous envoie mon nouveau 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 '%':
//printf("%d\n",&format[] );
switch(format[++i])
{
case 's':
//write(1, va_arg(ap, char), sizeof(char));
write(1, s=va_arg(ap, char*), (size_t)strlen(s));
break;
case 'd':
write(1, va_arg(ap, int), sizeof(int));
break;
case 'c':
write(1, va_arg(ap, char), sizeof(char));
break;
default:
write(1, "%", sizeof(char));
write(1, &format[i], sizeof(char));
}
break;
default :
write(1, &format[i], sizeof(char));
}
i++;
}
va_end(ap);
return 0;
}
Et le main :
#include "main.h"
#include "myprintf.h"
int main(int argc, char* argv[])
{
int a=1;
printf("\nExemple 1 : \n");
myprintf("1 - une chaine\n");
//myprintf("2 - %s\n", "une autre chaine");
myprintf("3 - %i\n", 42);
myprintf("3====> - %d\n", 42);
myprintf(" ====> - %c\n", "parametres");
myprintf("4 - %s %d %s%c\n", "avec", 4, "parametres", '\n');
return 0;
}
#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 '%':
//printf("%d\n",&format[] );
switch(format[++i])
{
case 's':
//write(1, va_arg(ap, char), sizeof(char));
write(1, s=va_arg(ap, char*), (size_t)strlen(s));
break;
case 'd':
write(1, va_arg(ap, int), sizeof(int));
break;
case 'c':
write(1, va_arg(ap, char), sizeof(char));
break;
default:
write(1, "%", sizeof(char));
write(1, &format[i], sizeof(char));
}
break;
default :
write(1, &format[i], sizeof(char));
}
i++;
}
va_end(ap);
return 0;
}
Et le main :
#include "main.h"
#include "myprintf.h"
int main(int argc, char* argv[])
{
int a=1;
printf("\nExemple 1 : \n");
myprintf("1 - une chaine\n");
//myprintf("2 - %s\n", "une autre chaine");
myprintf("3 - %i\n", 42);
myprintf("3====> - %d\n", 42);
myprintf(" ====> - %c\n", "parametres");
myprintf("4 - %s %d %s%c\n", "avec", 4, "parametres", '\n');
return 0;
}
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
12 févr. 2013 à 17:12
12 févr. 2013 à 17:12
Et bien il s'agit encore d'une erreur sur les %d et les %c, en aucun cas sur %s qui fonctionne.
Le problème c'est ton write, tu passes en deuxième argument un entier (pour %d) alors que l'on attends un pointeur sur une chaîne de caractère, ensuite ton troisième argument devrait correspondre à la taille de cette chaîne de caractères et ce n'est pas le cas non plus !
Le problème c'est ton write, tu passes en deuxième argument un entier (pour %d) alors que l'on attends un pointeur sur une chaîne de caractère, ensuite ton troisième argument devrait correspondre à la taille de cette chaîne de caractères et ce n'est pas le cas non plus !
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
12 févr. 2013 à 17:46
12 févr. 2013 à 17:46
Il ne s'agit pas de rajouter des *, mais de transformer ton entier en chaines de caractères, c'est à dire utiliser itoa ou une fonction équivalente.
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
12 févr. 2013 à 18:44
12 févr. 2013 à 18:44
itoa est une fonction de conversion pour passer de l'entier int à un char* qui représente l'entier.
On passe donc de 42 à "42", c'est indispensable puisque c'est un char* que tu affiches avec write.
On passe donc de 42 à "42", c'est indispensable puisque c'est un char* que tu affiches avec write.
12 févr. 2013 à 16:13
12 févr. 2013 à 16:20
12 févr. 2013 à 16:33
#include "main.h"
#include "myprintf.h"
int main(int argc, char* argv[])
{
int a=1;
printf("\nExemple 1 : \n");
myprintf("1 - une chaine\n");
//myprintf("2 - %s\n", "une autre chaine");
myprintf("3 - %i\n", 42);
myprintf("3====> - %d\n", 42);
myprintf(" ====> - %c\n", "parametres");
myprintf("4 - %s %d %s%c\n", "avec", 4, "parametres", '\n');
return 0;
}
Exemple 1 :
1 - une chaine
3 - %i
3====> -
====> - Illegal instruction: 4
12 févr. 2013 à 16:46
Moi je me basais sur ton code initial, et avec le i++ tu n'avais aucun % qui ne fonctionnait, alors qu'avec le ++i les %s fonctionnent, même si cela provoquait des erreurs pour %d et %c.
Si tu veux parler de ton nouveau code, donne le nous, mais si je prends ton code initial avec la seule modification du ++i alors tu devrais avoir une erreur sur le %d, pas sur les %s