Convertir un int en char [Fermé]

Signaler
-
Messages postés
4068
Date d'inscription
jeudi 18 août 2011
Statut
Membre
Dernière intervention
19 juin 2017
-
Bonjour,
je viens de commencer a programmer des add-in pour casio en c.
la fonction permettant d'afficher du text est la suivante :
void Print(const unsigned char *str)
dans les examples que j'ai trouvé il y a par example :
Print((unsigned char*)"du texte ...");
et ca marche bien.
j'aimerais savoir si il est possible de convertir un int dans ce type pour afficher un nombre.
j'ai essayer d'utiliser :
int nombre=5;
Print((unsigned char*) nombre);
mais ca ne marche pas.

merci d'avance pour votre aide

PS : je suis encore débutant en c
A voir également:

8 réponses

Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 749
Bonjour,
Tu peux par exemple passer par une chaîne.
Par exemple :
char chaine[TAILLE];
sprintf(chaine, "%d", nombre);
Print(chaine);

Après, faut voir quelles sont les fonctions autorisées en C sur ta casio.
Bonjour,
j'ai fait comme tu m'as dis :
char chaine[10];
sprintf(chaine, "%d", nombre);
Print(chaine);

mais ca ne marche pas. il n'y as pas d'erreur a la compilation mais lorsque le code passe a la ligne
sprintf(chaine, "%d", nombre);

il ne met pas la bonne valeur dans chaine et a la ligne
Print(chaine);

il n'affiche rien.
j'ai tester avec nombre=1 donc le probleme ne viens pas de la taille de chaine.
Messages postés
4068
Date d'inscription
jeudi 18 août 2011
Statut
Membre
Dernière intervention
19 juin 2017
701
C'est du C casio, ça dépends grandement de leur implémentation...
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 749
Comment tu sais qu'il ne met pas la bonne valeur dans "chaine" ?
Sinon, le code que je t'ai donné (hormis le Print(), en C on utiliserait plutôt printf("%s_n", chaine); ou simplement puts(chaine)), fonctionne.
Si ça ne marche pas, c'est plutôt du côté de Casio qu'il faut regarder. Je ne connais pas Casio...


Google is your friend
Messages postés
4068
Date d'inscription
jeudi 18 août 2011
Statut
Membre
Dernière intervention
19 juin 2017
701
yop !

si printf n'existe pas, à mon avis sprintf n'existe pas non plus...

EDIT:
non en fait, d'après la doc casio (https://www.planet-casio.com/files/logiciels/Manuels_sdk_fx9860_g75_85_95.zip sprintf est bien supporté, de même que sscanf...

leur prototype:
int sprintf(char *s, const char *control[, arg ...])
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 749
Rien ne dit que printf() ne marche pas. Print() aurait pu être une simple surcharge de printf()...
Après comme je dis, c'est plus spécifique à Casio qu'au C :-).
Messages postés
4068
Date d'inscription
jeudi 18 août 2011
Statut
Membre
Dernière intervention
19 juin 2017
701
sisi, la doc dit explicitement que printf n'est pas supporté ;-)
Après, pourquoi sprintf l'est...
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 749
J'ai juste lu son post, je ne suis pas allé lire la doc sur Casio :-)
Après en prenant le soin de lire la doc de Casio, on doit pouvoir répondre à la question :-).
Je sais qu'il ne met pas la bonne valeur dans chaine car j'ai regarder sa valeur avec le débogueur et printf ne marche pas sur casio. je vais essayer de chercher sur des sites spécifiques a casio mais merci quand meme.
Messages postés
4068
Date d'inscription
jeudi 18 août 2011
Statut
Membre
Dernière intervention
19 juin 2017
701
Tu peut toujours essayer de faire toi même une fonction de conversion entier vers chaîne, c'est intéressant à coder et résoudrait ton problème;
Messages postés
4068
Date d'inscription
jeudi 18 août 2011
Statut
Membre
Dernière intervention
19 juin 2017
701 >
Messages postés
4068
Date d'inscription
jeudi 18 août 2011
Statut
Membre
Dernière intervention
19 juin 2017

Par exemple, une boucle do while qui boucle tant que le nombre a tester est supérieur a dix, et qui dans un premier temps, calcule le modulo de ce nombre par 10, le convertit en ASCII et le stocke dans un coin avant de le soustraire au nombre à tester, puis de diviser celui-ci par dix.

Tu devrait obtenir le nombre à l'envers, et il suffit alors de l'afficher à rebours.

C'est une méthode parmis bien d'autres, sûrement pas la plus facile ni la plus optimisée.
Bonjour et merci de ta réponse,
je n'ai pas bien compris ton explication malgré quelques efforts. Te serais-il possible de faire ce code et de le poster afin que je comprenne mieux ? merci.
Messages postés
4068
Date d'inscription
jeudi 18 août 2011
Statut
Membre
Dernière intervention
19 juin 2017
701
Une fonction toute faite trouvée ici, que j'ai commentée, qui permet de convertir un entier en chaine de caractère.

#include <stdio.h>
// la fonction a pour argument le nombre à convertir et un pointeur vers une chaine "vide"
char* itoa(int i, char b[]){
    char* p = b; //on crée un pointeur vers la chaine en question
    if(i<0){ // si le nombre est négatif...
        *p++ = '-'; // alors le premier élément de la chaine est un moins
        i *= -1; // et on prends l'opposé du nombre.
    }

/* cette variable et la boucle qui suis a pour but de se déplacer à la fin de la représentation du 
nombre dans la chaine de caractère. */
    int shifter = i;
    do{
        ++p;
        shifter = shifter/10;
    }while(shifter);

    // on définis le caratère de fin de chaine
    *p = '\0';
    do{ //et on recule dans la chaine, en convertissant au fur et à mesure
/* 30 est la position de zéro dans la table ascii. i%10 permets de 
prendre le reste de la division euclidienne de i par 10, soit en fait le 
premier chiffre du nombre.*/
        *--p = 30 + i%10; 
        i = i/10; // on divise par 10, ce qui reviens à supprimer le premier chiffre.
} 


Elle n'est pas parfaite, bien sur, mais devrait convenir...
Bonjour,
j'ai compris ton code et il me parait bien (a part que je ne vois pas l'accolade de fin du dernier "do")
mais il refuse de compiler et je n'arrive pas a savoir pourquoi...

j'ai aussi remarqué que l'on envoi une chaine en argument et non pas un pointeur ce qui veut dire que c'est une "copie" de la chaine d'origine et donc que la chaine d'origine n'est pas modifier par la fonction. De plus, la fonction ne contient pas de return ce qui veut dire qu'elle ne renvoie rien alors que la fonction est de type char* ce qui veut dire quelle renvoie un pointeur (c'est contradictoire). Je ne sais donc pas très bien comment utiliser la fonction.
si c'est une erreur de ma part, merci de m'expliquer pourquoi et comment utiliser cette fonction (avec un exemple si possible).
Et si c'est une erreur de votre part, pouvez vous me dire ce qu'il faut mettre exactement après le return et comment récupérer ce que renvoie la fonction car je ne suis pas très a l'aise avec les pointeurs (je suis débutant en c).

merci pour vos réponses
Messages postés
4068
Date d'inscription
jeudi 18 août 2011
Statut
Membre
Dernière intervention
19 juin 2017
701
Pour la chaine, c'est un piège !

en fait, la notation
chaine[] 
équivaut à
*chaine
, et
chaine[x]
à
*(chaine + x)
, et sachant que lorsque on incrémente un pointeur de x, on l'incrémente en fait de x fois la taille d'un élément !

C'est dû au fait qu'un tableau, qu'il soit de caractère ou non, n'a pas de taille limite ni prédéterminée, et donc que une fonction ne peut pas la dupliquer correctement, ou du moins pas sans code spécifique aux chaînes.

Pour éviter les confusions, il est parfois plus logique d'utiliser la seconde notation, même si elle est moins pratique. En fait, je la préfère à l'autre, car elle nous empêche d'oublier comment fonctionne la mémoire !

Et j'ai bien viré deux lignes par erreur -_-'

Mea culpa !

on a donc:

#include <stdio.h>
// la fonction a pour argument le nombre à convertir et un pointeur vers une chaine "vide"
// char b[] équivaut à char *b !
char* itoa(int i, char b[]){
    char* p = b; //on crée un pointeur vers la chaine en question
    if(i<0){ // si le nombre est négatif...
        *p++ = '-'; // alors le premier élément de la chaine est un moins
        i *= -1; // et on prends l'opposé du nombre.
    }

/* cette variable et la boucle qui suis a pour but de se déplacer à la fin de la représentation du 
nombre dans la chaine de caractère. */
    int shifter = i;
    do{
        ++p;
        shifter = shifter/10;
    }while(shifter);

    // on définis le caratère de fin de chaine
    *p = '\0';
    do{ //et on recule dans la chaine, en convertissant au fur et à mesure
/* 30 est la position de zéro dans la table ascii. i%10 permets de 
prendre le reste de la division euclidienne de i par 10, soit en fait le 
premier chiffre du nombre.*/
        *--p = 30 + i%10; 
        i = i/10; // on divise par 10, ce qui reviens à supprimer le premier chiffre.
    }while(i); // tant que i est différent de 0
    return b; // et on retourne un pointeur vers notre chaîne !
}
Messages postés
609
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
24 juin 2016
42
Bonjour,
le langage de programmation C, est un langage qui manipule essentiellement les adresses donc un langage bas niveau.
Quand bien même, la façon d'écrire votre fonction qui attend un tableau en argument, le langage C le transforme automatiquement en pointeur sur le premier élément du tableau donc, en peut très bien écrire directement
int f_MyFunc(int * iTab); 

elle est identique à écriture de la fonction poster plus haut mais, il faut comprendre que dans les deux cas on passe l'adresse du tableau à la fonction, en clair on travaille toujours sur l'original et non une copie de celle-ci.
à bientôt
Bonjour,
j'ai du mal a comprendre comment on utilise cette fonction, comment envoit-on un pointeur en parametre ? pourrier vous me donner un exemple de code utilisant cette fonction ?
de plus, je n'ai pas tres bien compris pourquoi il y a un return a la fin de la fonction si la chaine est directement modifier, pourquoi renvoit-on la chaine qui a ete donner en parametre si ce n'est pas une copie de la chaine qui est modifier
Messages postés
4068
Date d'inscription
jeudi 18 août 2011
Statut
Membre
Dernière intervention
19 juin 2017
701
Tu n'a pas tors:
il ne sert en théorie à rien de retourner l'adresse de la chaîne.

Toutefois, ce genre de returns peut permettre dans certains cas de faire une pierre deux coup, et cela ne coute rien sinon de la clarté de la faire.

Un exemple de code:

#include <stdio.h>
#include <stdlib.h>

// le code de la fonction itoa à rajouter

int          main(argc, **argv) {
  int nombre;
  char *chaine;

  nombre = 42;
  chaine = malloc(3); // attention à la taille du malloc !! il doit être égal à la taille de la chaine plus 1 !
  itoa(nombre, chaine);
  printf("%s", chaine);
  free(chaine); // ne pas oublier non plus, très important.

}
Je viens de m'apercevoir que plus aucun code ne peut se compiler (même le code par défaut !) ce qui veut dire que l'erreur viens du logiciel. Je vais essayer de trouvé ce qu'il se passe et je vous préviendrais dés que j'aurais réussis à le refaire marcher. (quand je pense à tout ce temps que j'ai passé alors que si ça se trouve mon code marchait parfaitement !)
Messages postés
4068
Date d'inscription
jeudi 18 août 2011
Statut
Membre
Dernière intervention
19 juin 2017
701
ha. Bon bah voilà qui explique tout !!