我在她的编程课上帮助了一位朋友,我们遇到了一些有趣的事情。我们有代码:
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并不喜欢它并且每次运行它都会使我的程序崩溃。
如果有人能解释为什么它不起作用,我会永远感激。
答案 0 :(得分:1)
scanf("%s",&continuar);
这应该是:
scanf("%c",&continuar);
当您读入单个字符而不是字符串时。
使用scanf("%s"
,它不仅会写入continuar
,而且会写入它周围的内存(多少取决于读取的字符数),因此您的i
变量必须位于旁边它被覆盖回0
。
编辑:
根据@ WeatherVane的评论,solution实际应该是:
scanf(" %c",&continuar);
由于您上次读取浮点数,因此仍然无法读取换行符(来自您按Enter键)并将其放入字符中。