为什么这段代码不打印某些值?

时间:2016-05-31 13:55:14

标签: c

我不明白为什么当我尝试使用archivio[]功能打印stampa中的值时,此程序会打印

"studente","matricola","nome","cognome"

正确,但不会打印stampaEsami的值。

#include <stdio.h>
#include <stdlib.h>
#define MAXSTUDENTI 20
#define MAXSTRINGA 100
#define MAXESAMI 25

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

typedef char Stringa[MAXSTRINGA];

typedef enum { uno, due, tre, FC
} AnnoCorso;

typedef struct {
    Stringa nomeEsame;
    int voto;
} Esame;

typedef struct {
    Esame listaEsami[MAXESAMI];
    int numeroEsami;
}ListaEsame; 

typedef struct {
    int matricola;
    Stringa nome;
    Stringa cognome;
    AnnoCorso anno;
    ListaEsame esami;
} Studente;

void init(Studente[], int);
void acquisisciEsami(Studente, int);
void stampa(Studente[], int);
void stampaEsami(ListaEsame);

void init(Studente archivio[], int n){

    int i;
    int nEsami;

    for(i = 0;  i < n; i++){
        printf("Studente n. %d\n", i+1);
        printf("Inserire matricola: ");
        scanf("%d", &archivio[i].matricola);
        printf("Inserire nome: ");
        scanf("%s", &archivio[i].nome);
        printf("Inserire cognome: ");
        scanf("%s", &archivio[i].cognome);
        printf("Inserire il numero di esami svolti: ");
        scanf("%d", &archivio[i].esami.numeroEsami);
        nEsami = archivio[i].esami.numeroEsami;
        if(nEsami != 0) {
            acquisisciEsami(archivio[i], nEsami);
        }

    }

}

void acquisisciEsami(Studente studente, int n){

    int i;

    for(i = 0; i < n; i++) {
        printf("Inserire nome esame:");
        scanf("%s", studente.esami.listaEsami[i].nomeEsame);
        printf("Inserire voto esame:");
        scanf("%d", &studente.esami.listaEsami[i].voto);
    }

}

void stampa(Studente archivio[], int n){

    printf("\nGli studenti presenti in archivio sono:\n");

    int i;

    for(i = 0; i < n; i++){
        printf("Studente n. %d:\n", i+1);
        printf("Matricola: %d\n", archivio[i].matricola);
        printf("Nome: %s\n", archivio[i].nome);
        printf("Cognome: %s\n", archivio[i].cognome);
        stampaEsami(archivio[i].esami);
    }
}

void stampaEsami(ListaEsame esami){

     int i = 0; 
     int n = esami.numeroEsami;

     for(i = 0; i < n; i++){
        printf("Nome esame: %s\n", esami.listaEsami[i].nomeEsame );
        printf("Voto esame: %d\n", esami.listaEsami[i].voto);
     }
}

int main(int argc, char *argv[]) {

    Studente studenti[MAXSTUDENTI] ;
    int n;

    printf("Inserire il numero di studenti da memorizzare in archivio:\n ");
    scanf("%d", &n);
    init(studenti, n);
    stampa(studenti, n);

    return 0;
}

如果输入为:

Inserire il numero di studenti da memorizzare in archivio:1
Inserire matricola: 13434
Inserire nome: test
Inserire cognome: test
Inserire il numero di numero di esami svolti: 1
Inserire nome esame: asd2
Inserire voto esame: 20

打印:

Gli studenti presenti in archivio sono:
Studente n.1:
Matricola: 13434
Nome : test
Cognome: test
Nome esame:
Voto esame: 0

1 个答案:

答案 0 :(得分:3)

您的问题是acquisisciEsami功能。

它应该接受Studente *,而不是通过值传递的变量。

void acquisisciEsami(Studente *studente, int n)
{
    int i;

    for(i = 0; i < n; i++) 
    {
        printf("Inserire nome esame:");
        scanf("%s", studente->esami.listaEsami[i].nomeEsame);
        printf("Inserire voto esame:");
        scanf("%d", &studente->esami.listaEsami[i].voto);
    }
}

那么问题是什么?您的代码正在编译一个具有acquisisciEsami函数的本地范围的结构,并且当函数结束时所有数据都将丢失。因此,esami的{​​{1}}成员不会被修改。

通过archivio[i]引用archivio[i],您可以更改acquisisciEsami

的esami memeber的内容

显然,archivio[i]的来电将是:

acquisisciEsami

正如我所说,你有问题要解决:

  • acquisisciEsami(&archivio[i], nEsami); 必须为scanf("%s", &archivio[i].nome);
  • scanf("%s",archivio[i].nome);应为scanf("%s", &archivio[i].cognome);