Conversion d'un nombre en C
£udo
Messages postés
455
Statut
Membre
-
spidag -
spidag -
salut, j'ai un programme qui demande a saisir un retard. Ce doit etre obligatoirement un chiffre donc j'effectue une verification. Ensuite, si cette verification est correcte le retard est enregsitré dans le fichier. Le probleme est que par exemlle, si l'on tape 2, il y aura marqué 50 dans le fichier, si on tape 3, ce sera 51. Je crois que cela est du au fait que lorsque je saisie le retard, je saisis un char. Et ensuiite quand je verifie, je mets ce char dans un int (car l'enregistrement du retard dans le fichier est un int). Comment je dois faire pour que mon chiffre tapé reste le meme??
Voila mon code de verification :
Voila mon code pour la saisie du retard :
Comment résoudre l'erreur?? Avec mon prof, il me parlait d'une histoire de conversion de int en char ? Mais ne peut ton pas convertir un ascii en int ou vice versa ??
Si oui comment faire ??
Merci d'avance
(¯`·.¸¸.-> £udo <-.¸¸.·´¯)
Voila mon code de verification :
int verifnum(char *machin)
{
char test;
test=*machin;
//printf("le retard vaut : %c\n\n",retard);
//printf("machin vaut %c",*machin);
while(isdigit(test)==0)
{
printf("Erreur sur le nombre, resaisissez :");
flushall();
scanf("%c",&test);
}
//printf("retard vaut maintenant %c",retard);
//ok=isdigit(*machin);
//printf("ok vaut %c",ok);
return test;
}
Voila mon code pour la saisie du retard :
char machin;
char choix;
int retard;
...
printf("RETARD(S): ");
scanf("%c",&machin);//%c pour prendre que le 1er caractère saisi
retard=verifnum(&machin);//appel a la fonction
printf("machin vaut apres la verif %c\n",retard);
seleve.retard=retard;
Comment résoudre l'erreur?? Avec mon prof, il me parlait d'une histoire de conversion de int en char ? Mais ne peut ton pas convertir un ascii en int ou vice versa ??
Si oui comment faire ??
Merci d'avance
(¯`·.¸¸.-> £udo <-.¸¸.·´¯)
9 réponses
-
Salut,
Convertir un int en ascii ou vice versa, revient à convertir int en char et vice versa! -
a oué , j'avais pas fais gaffe. On fait comment stp ?.
(¯`·.¸¸.-> £udo <-.¸¸.·´¯) -
C'est bizarre j'ai copier puis coller ton code et il fonctionne plutôt bien chez moi. Si je rentre 2 le printf retourne bien 2.
sinon pour conversion de char vers int
atoi(const char *)
Stef -
le code marche aussi chez moi, la varification passe et me renvoie bien le chiffre passé au debut. C'est au moment de l'enregistrement que ça passe pas
(¯`·.¸¸.-> £udo <-.¸¸.·´¯) -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
tu veux bien mettre ton code qui écrit dans le fichier s'il te plait.
Stef -
voila ma fonction ajout()
void ajout(FILE *f,char *n) { char machin; char choix; int retard; system("cls"); printf("AJOUT D'UNE FICHE ELEVE\n\n"); printf("ENTRER LE NOM DU FICHIER DANS LEQUEL VOUS VOULEZ L'INSCRIRE: "); flushall(); gets(n); flushall(); f = fopen(n,"a+"); //ouverture en "a+":lecture/écriture d'un fichier existant (mise à jour), pas de création //d'une nouvelle version, le pointeur est positionné à la fin du fichier. if (f == NULL) { printf("\nERREUR, CE FICHIER N'EXISTE PAS\n\n"); getch(); } else { do { printf("\nSAISIE D'UNE FICHE ?(o/n) "); choix = (char)getchar(); flushall(); if ((choix=='o')||(choix=='O')) { printf("\nNOM: "); gets(seleve.nom); flushall(); printf("PRENOM: "); gets(seleve.prenom); flushall(); printf("CLASSE: "); gets(seleve.classe); flushall(); //retard();/* printf("RETARD(S): "); scanf("%c",&machin);//%c pour prendre que le 1er caractère saisi retard=verifnum(&machin);//appel a la fonction printf("machin vaut apres la verif %c\n",retard); seleve.retard=retard; printf("RETENUE(S): "); scanf("%d",&seleve.retenue); flushall(); printf("ABSCENCE(S): "); scanf("%d",&seleve.abs); flushall(); fwrite(&seleve,sizeof(seleve),1,f); } }//fin do while((choix=='o')||(choix=='O')); }//fin else fclose(f); }
Jutilis donc la fonction verifnum() pour verifier que ce que saisi l'utilisateur soit bien un chiffre. ET quand ça marchera je le fera pour abscences et retenues.
La fonction verifnum() est la même qu'en haut
(¯`·.¸¸.-> £udo <-.¸¸.·´¯) -
essaies de faire
return atoi(test);
comme retout de verifNum
Stef -
non ca marche pas, il me sort un bug juste apres avoir saisi le retard et apres je peux plus rien faire, je dois fermer mon PG
(¯`·.¸¸.-> £udo <-.¸¸.·´¯)-
essaie ceci, chez moi ça fonctionne
#include <stdio.h> #include <string.h> #include <stdlib.h> int verifnum(char * str); int main(int argc, char * argv[]) { int x; char buffer[64]; do { printf(" Entrer un nombre : "); gets(buffer); x = verifnum(buffer); } while (x < 0); printf(" retard : %d", x); getchar(); return 0; } int verifnum(char * str) { int i, l = strlen(str); for (i = 0; i < l; i++) { if (!isdigit((int) str[i])) { i = -1; return i; } } return atoi(str); } -
jte remercie de ta reponse, mais je comprends pas trop les conditions de if. Peux tu m'expliquer stp?
(¯`·.¸¸.-> £udo <-.¸¸.·´¯)- la condition du if test si le caractère est bien un entier ou pas.
int isdigit(int x) test le code ascii du caractère x (d'où le cast vers l'entier) et renvoie true s'il s'agit bien d'un entier et false sinon.
le ! est le not.
Il faut donc comprendre la fonction comme ceci:
pour tous les caractères de la chaine passée en argument (boucle for), dès qu'un caractère n'est pas un entier (condition if) on renvoie -1 pour exprimer l'erreur.
Après, dans le programme principal, on peut tester la valeur de retour de la fonction. Si c'est -1, c'est que notre chaine n'est pas un nombre correctement formaté.
C'est clair ?
-
-