我正在帮助一位 friend 上编程课,我们遇到了一些有趣的事情。我们有代码:
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 人类(class)的成绩表;您介绍学生的数据,直到按“n”,然后将它们保存在列表中。现在,我弄清楚了指针部分(我真的了解 Java,所以在 C 上工作有点奇怪),但我不知道如何使 i++ 部分工作。如果你像这样运行它,它会在第一次通过时以 i=0
开始,然后遍历所有代码,最后执行 i++
,然后再询问你是否想要继续(它将其打印在屏幕上)。但是,当您按“s”表示您想继续时,它会再次以 i=0
开头,我一生都无法弄清楚为什么。我尝试了 i++
、++i
、i=i+1
等,但似乎没有任何效果。我什至尝试让 i
成为一个指针,但 Windows 不喜欢它,并且每次运行它时都会使我的程序崩溃。
如果有人能解释为什么它不起作用,我将永远感激不已。
最佳答案
scanf("%s",&continuar);
这应该是:
scanf("%c",&continuar);
当您读入单个字符而不是字符串时。
使用scanf("%s"
),它不仅会写入continuar
,还会写入其周围的内存(多少取决于读取的字符数)等等您的 i
变量必须位于它旁边,并且会被覆盖回 0
。
编辑:
根据 @WeatherVane 的评论,solution实际上应该是:
scanf(" %c",&continuar);
自从您上次读取 float 以来,换行符(从您按 Enter 键开始)仍然不会被读取,并将被放入字符中。
关于c - i++ 不在 while 循环内工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37686992/