Conversion d'un nombre en C

Fermé
£udo Messages postés 455 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 19 décembre 2006 - 21 nov. 2005 à 20:11
 spidag - 25 oct. 2007 à 13:55
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 :
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

hssissen Messages postés 844 Date d'inscription mercredi 20 juillet 2005 Statut Membre Dernière intervention 9 janvier 2017 50
21 nov. 2005 à 20:30
Salut,
Convertir un int en ascii ou vice versa, revient à convertir int en char et vice versa!
0
£udo Messages postés 455 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 19 décembre 2006 16
21 nov. 2005 à 20:31
a oué , j'avais pas fais gaffe. On fait comment stp ?.
(¯`·.¸¸.-> £udo <-.¸¸.·´¯)
0
scol30 Messages postés 22 Date d'inscription samedi 19 novembre 2005 Statut Membre Dernière intervention 2 décembre 2005
21 nov. 2005 à 20:42
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
0
£udo Messages postés 455 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 19 décembre 2006 16
21 nov. 2005 à 20:44
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 <-.¸¸.·´¯)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
scol30 Messages postés 22 Date d'inscription samedi 19 novembre 2005 Statut Membre Dernière intervention 2 décembre 2005
21 nov. 2005 à 20:45
tu veux bien mettre ton code qui écrit dans le fichier s'il te plait.

Stef
0
£udo Messages postés 455 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 19 décembre 2006 16
21 nov. 2005 à 20:48
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 <-.¸¸.·´¯)
0
scol30 Messages postés 22 Date d'inscription samedi 19 novembre 2005 Statut Membre Dernière intervention 2 décembre 2005
21 nov. 2005 à 21:31
essaies de faire
return atoi(test);
comme retout de verifNum

Stef
0
£udo Messages postés 455 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 19 décembre 2006 16
21 nov. 2005 à 21:54
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 <-.¸¸.·´¯)
0
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);
}
0
£udo Messages postés 455 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 19 décembre 2006 16
22 nov. 2005 à 09:49
jte remercie de ta reponse, mais je comprends pas trop les conditions de if. Peux tu m'expliquer stp?
(¯`·.¸¸.-> £udo <-.¸¸.·´¯)
0
cataclypse > £udo Messages postés 455 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 19 décembre 2006
23 nov. 2005 à 08:46
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 ?
0
Bonjour,
je supose que ton entier s'apelle i et ton char s'apelle c.

i=c-50;
0