Souad Souad - 28 days ago 7
C Question

Wrong output with C program

I'm trying to get this code work:

#include<stdio.h>
#include<conio.h>
#define N 2

typedef struct identite
{
char numClient[20];
char nom[20];
char prenom[20];

}Identite;

typedef struct facture
{
int numFacture;
Identite personne;
float prix;
int anlimite;
}Facture;

Facture tabFactures[10];
// initialisation ???

Facture saisirFacture()
{
Facture uneFacture;
printf("saisissez le numero de la facture: ");
scanf("%d",&uneFacture.numFacture);
printf("saisissez le numero du client: ");
scanf("%s",&uneFacture.personne.numClient);
printf("saisissez le nom du client: ");
scanf("%s",&uneFacture.personne.nom);
printf("saisissez le prenom du client: ");
scanf("%s",&uneFacture.personne.prenom);
printf("saisissez le prix: ");
scanf("%f",&uneFacture.prix);
printf("saisissez anlimite: ");
scanf("%d",&uneFacture.anlimite);
printf("Vous avez renseigné tous les champs, Merci.\n");
return uneFacture;
}

void saisirTabFacture(){
int i;
i=0;
Facture fi;
while (i<N){
tabFactures[i]=fi;
saisirFacture(fi);
i++;
}
getch();
}

void afficheFacture(Facture uneFacture)
{
printf("le numero de la facture est:%d\n",uneFacture.numFacture);
printf("le numero du client est:%s\n",uneFacture.personne.numClient);
printf("le nom du client est:%s\n",uneFacture.personne.nom);
printf("le prenom du client est:%s\n",uneFacture.personne.prenom);
printf("le prix est:%f\n",uneFacture.prix);
printf("annee limite est:%d\n",uneFacture.anlimite);
getch();
}

void afficheTabFacture()
{
Facture fi;
int i;
for(i=0;i<N-1;i++){
tabFactures[i]=fi
afficheFacture(tabFactures);
}
}

int main(){
Facture tabFactures[N];
Facture uneFacture;
printf("la saisie des factures : \n");
saisirTabFacture();
printf("les factures qui vous avez saisi sont:");
afficheTabFacture(tabFactures);

return 0;
}


Everything works fine except the output of the function
afficherTabFacture(tabFactures)
, instead of giving the strings I have entered it gives special characters, or it gives O or empty values. Here is an image:

enter image description here

Could you please help me to solve it?

Thank you very much.
Best regards.

Answer

There are multiple problems in your code:

  • saisirFacture returns a Facture by value, but you do not store this return value, instead you pass a Facture as an argument in saisirTabFacture.

  • There is local array tabFactures in main and a global variable by the same name: main and saisirTabFacture are not referring to the same array.

  • afficheTabFacture should be passed a Facture object, not an array of Facture objects.

Here is a modified version that will prompt for 2 bills and then print them:

#include <stdio.h>
#include <conio.h>

#define N 2

typedef struct identite {
    char numClient[20];
    char nom[20];
    char prenom[20];
} Identite;

typedef struct facture {
    int numFacture;
    Identite personne;
    float prix;
    int anlimite;
} Facture;

Facture saisirFacture(void) {
    Facture uneFacture;
    printf("saisissez le numero de la facture: ");
    scanf("%d", &uneFacture.numFacture);
    printf("saisissez le numero du client: ");
    scanf("%19s", uneFacture.personne.numClient);
    printf("saisissez le nom du client: ");
    scanf("%19s", uneFacture.personne.nom);
    printf("saisissez le prenom du client: ");
    scanf("%19s", uneFacture.personne.prenom);
    printf("saisissez le prix: ");
    scanf("%f", &uneFacture.prix);
    printf("saisissez anlimite: ");
    scanf("%d", &uneFacture.anlimite);
    printf("Vous avez renseigné tous les champs, Merci.\n");
    return uneFacture;
}

void saisirTabFacture(Facture tabFactures[]) {
    for (int i = 0; i < N; i++) {
        tabFactures[i] = saisirFacture();
    }
    getch();
}

void afficheFacture(Facture uneFacture) { 
    printf("le numero de la facture est:%d\n", uneFacture.numFacture);
    printf("le numero du client est:%s\n", uneFacture.personne.numClient);
    printf("le nom du client est:%s\n", uneFacture.personne.nom);
    printf("le prenom du client est:%s\n", uneFacture.personne.prenom);
    printf("le prix est:%f\n", uneFacture.prix);
    printf("annee limite est:%d\n", uneFacture.anlimite);
    getch();
}

void afficheTabFacture(Facture tabFactures[]) {     
    for (int i = 0; i < N; i++) {
        afficheFacture(tabFactures[i]);
    }
}

int main(void) {
    Facture tabFactures[N];
    Facture uneFacture;
    printf("la saisie des factures : \n");
    saisirTabFacture(tabFactures);
    printf("les factures qui vous avez saisi sont:");
    afficheTabFacture(tabFactures);

    return 0;
}
Comments