我正在尝试使此代码工作:

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


除了函数afficherTabFacture(tabFactures)的输出之外,其他所有东西都正常运行,而不是给出我输入的字符串,而是给出特殊字符,或者给出O或空值。这是一张图片:

c - C程序输出错误-LMLPHP

你能帮我解决吗?

最佳答案

您的代码中存在多个问题:


saisirFacture按值返回Facture,但是您不存储此返回值,而是将Facture作为参数传递给saisirTabFacture
tabFactures中有本地数组main,并且有一个同名的全局变量:mainsaisirTabFacture没有引用相同的数组。
afficheTabFacture应该传递一个Facture对象,而不是Facture对象的数组。


这是修改后的版本,将提示您输入2张钞票,然后打印出来:

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

10-04 21:53