Conversion en C

Fermé
£udo
Messages postés
455
Date d'inscription
mardi 8 juin 2004
Statut
Membre
Dernière intervention
19 décembre 2006
- 17 oct. 2005 à 18:38
mamiemando
Messages postés
31295
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
9 août 2022
- 17 oct. 2005 à 22:41
salut, voila mon code
void ajout(FILE *f,char *n)
{
char machin;
char choix;

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(strupr(seleve.nom));
					flushall();
					printf("PRENOM: ");
					gets(seleve.prenom);
					flushall();
					printf("CLASSE: ");
					gets(seleve.classe);
					flushall();
					//retard();/*
					printf("RETARD(S): ");
					scanf("%s",&machin);
					while(isdigit(machin)==0)
						{
							printf("Erreur, saisissez un nombre\n");
							scanf("%s",&machin);
						}
					
					printf("OK");
					
					strcpy(&seleve.retard,machin);

					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);
}

Cet apres midi, jai donc voulu faire un controle. Il faut que le retard saisi par l'utilisateur soit un chiffre sinon ça passe pas. Donc je fais le controle et ça marche. Apres jveux l'enregistrer mais ça passe pas. Je ne peux convertir une chaine en un entier. Jai testé avec la fonction atoi mais j'ai des erreurs. Comment je dois m'y prendre svp ??
(¯`·.¸¸.-> £udo <-.¸¸.·´¯)

3 réponses

crabs
Messages postés
908
Date d'inscription
lundi 18 avril 2005
Statut
Membre
Dernière intervention
3 août 2008
506
17 oct. 2005 à 20:25
Salut,
Dans tes déclarations :
char machin ; => c'est un caractère
Plus loin
scanf( "%s", &machin ) ; => si tu veux saisir un seul caractère c'est %c
Sinon risque d'avoir des plantages intempestifs
strcpy(&seleve.retard,machin); => la fonction strcpy() est réservée au
chaine de caractères (risque de plante), utilises une affectation simple
eleve.retard = machin ;
Ensuite pour convertir, si c'est un seul chiffre :
int retard_entier ; dans les déclarations
retard = (int)( retard - '0' ) ; dans le traitement
[ retard contient le code ascii du chiffre, si tu enlèves le code ascii de 0 au
code ascii d'un chiffre t'obtient la valeur entière de ce chiffre]

Si tu veux absolument saisir une chaine
char retard[16] ;
scanf( "%s", retard ) ; // ca protège pas contre dépassement de pile, mais
ça doit pas être encore au programme
vérification
ajout dans les déclarations :
int i,ok ;
Boucle de vérification
ok=0 ; 
while ( !ok )
  {
  printf( "Retard : " )  ; fflush(stdout ) ; fflush( stdin ) ;
  scanf( "%s", retard ) ;
  ok = 1 ; /* on part du principe que c'est ok
  for( i=0; retard[i]; i++ ) if ( !isdigit( retard[i] ) ) { ok=0; break ; }
  }
eleve.retard = atoi( retard ) ;

la boucle for() part du principe qu'en C, une chaine de caratères se termine
par le caractère 0 ( '\0' ) .
[j'espère ne pas trop m'être planté dans le code C]
A+, crabs
0
£udo
Messages postés
455
Date d'inscription
mardi 8 juin 2004
Statut
Membre
Dernière intervention
19 décembre 2006
16
17 oct. 2005 à 21:30
jte remercie ça passe bien. Mais je ne comprends pas trop la conversion
Ensuite pour convertir, si c'est un seul chiffre :
int retard_entier ; dans les déclarations
retard = (int)( retard - '0' ) ; dans le traitement
[ retard contient le code ascii du chiffre, si tu enlèves le code ascii de 0 au
code ascii d'un chiffre t'obtient la valeur entière de ce chiffre]

peux tu m'expliquer stp?
(¯`·.¸¸.-> £udo <-.¸¸.·´¯)
0
mamiemando
Messages postés
31295
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
9 août 2022
7 391
17 oct. 2005 à 22:41
En fait à chaque caractères est associé un code (le code ascii). Dans cette table, 0,1,2... se suivent, mais le nombre 0 n'a pas la valeur 0 en ascii ! Il faut donc translater les valeurs ascii et c'est le rôe de cette soustraction.

Pour plus de précisions :
man ascii


Bonne chance
0