Conversion en C

£udo Messages postés 455 Statut Membre -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
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

  1. crabs Messages postés 909 Statut Membre 507
     
    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
  2. £udo Messages postés 455 Statut Membre 16
     
    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
  3. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    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