我不明白为什么当我尝试使用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
答案 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
显然,archivio[i]
的来电将是:
acquisisciEsami
正如我所说,你有问题要解决:
acquisisciEsami(&archivio[i], nEsami);
必须为scanf("%s", &archivio[i].nome);
scanf("%s",archivio[i].nome);
应为scanf("%s", &archivio[i].cognome);