【发布时间】:2016-06-07 18:44:11
【问题描述】:
我正在帮助一位朋友上她的编程课,我们遇到了一些有趣的事情。我们有代码:
void ingresardatos(struct alumno *lista){
int i=0;
char continuar='s';
while(continuar=='s' && i<20){
printf("Valor de i al iniciar: %d \n", i);
printf("Introduzca el nombre del alumno:\n");
scanf("%s",&(lista[i].nombre));
printf("Introduzca la matricula:\n");
scanf("%s",&lista[i].matricula);
printf("Introduzca la primera calificacion:\n");
scanf("%f",&lista[i].calf1);
printf("Introduzca la segunda calificacion:\n");
scanf("%f",&lista[i].calf2);
printf("Introduzca la tercera caificacion:\n");
scanf("%f",&lista[i].calf3);
lista[i].prom=(lista[i].calf1+lista[i].calf2+lista[i].calf3)/3;
if(lista[i].prom<=5.9){
strcpy(lista[i].nota,"NA");
}
else if(lista[i].prom>=6 && lista[i].prom<=7.3){
strcpy(lista[i].nota,"S");
}
else if(lista[i].prom>=7.4 && lista[i].prom<=8.6){
strcpy(lista[i].nota,"B");
}
else if(lista[i].prom>=8.7 && lista[i].prom<=10){
strcpy(lista[i].nota,"MB");
}
printf("Valor de i antes: %d \n", i);
i++;
printf("Valor de i después: %d \n", i);
printf("¿Desea continuar? (S/N)");
scanf("%s",&continuar);
}
}
这应该是一个 20 人班级的成绩单;您介绍学生的数据,直到您按“n”,然后将它们保存在列表中。现在,我弄清楚了指针部分(我真的很了解 Java,所以在 C 上工作有点奇怪),但我不知道如何使 i++ 部分工作。如果您按原样运行它,它将在第一遍以i=0 开始,然后遍历所有代码,最后在询问您是否要继续之前执行i++(它会在屏幕上打印)。但是,当你按“s”表示你想继续时,它会再次以i=0 开头,而我这辈子都不知道为什么。我尝试了i++、++i、i=i+1 等等,但似乎没有任何效果。我什至尝试将 i 设为指针,但 Windows 不喜欢它,并且每次运行我的程序都会崩溃。
如果有人能解释为什么它不起作用,我将永远感激不尽。
【问题讨论】:
-
scanf("%s",&continuar);-continuar是单个char类型。它将破坏系统,因为该地址处的字符串输入将至少包含 2 个字符。 -
解释未定义的行为之后发生的事情并不是真的有效,但假设可以令人满意。 可能是,因为
i就在堆栈上的continuar上方,所以当您输入字符串 的数据时,'s'转到char continuar并且字符串终止符'\0'转到little-endian 变量i的最低有效字节。由于您在接受输入之前增加了i,因此可能用0覆盖了i的最小sig字节,将其值限制为0和导致你看到的行为。 如果.