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 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 - 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 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 7 748
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