Conversion d'un nombre en C
£udo
Messages postés
455
Date d'inscription
Statut
Membre
Dernière intervention
-
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 <-.¸¸.·´¯)
A voir également:
- Conversion d'un nombre en C
- Nombre de jours entre deux dates excel - Guide
- Nombre facile - Télécharger - Outils professionnels
- Ascii nombre de caractères - Guide
- Mettre un 0 devant un nombre dans excel - Guide
- Conversion mb en mo ✓ - Forum Matériel & Système
9 réponses
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
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 <-.¸¸.·´¯)
(¯`·.¸¸.-> £udo <-.¸¸.·´¯)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
voila ma fonction ajout()
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 <-.¸¸.·´¯)
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 <-.¸¸.·´¯)
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 <-.¸¸.·´¯)
(¯`·.¸¸.-> £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); }
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 ?
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 ?