c - 当我在 While 循环中使用浮点值时,为什么我的程序会进入无限循环?
问题描述
我的任务是做一个程序来读取一个学生的名字,他们的 4 个科目和他们各自的成绩。我使用过for
和while
循环,也使用过if
语句,到目前为止,这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main() {
printf("Este programa captura el nombre de un alumno \n");
printf ("y cuatro de sus materias y sus respectivas notas\n");
printf ("Nota: El programa solo toma en cuenta los dos primeros\n");
printf ("decimales de la notas expresada.\n\n");
char alumno[40] = {'\0'};
char mat[4][20] = {'\0', '\0', '\0', '\0'};
float calif[4] = {-1, -1, -1, -1};
int i;
while (alumno[0] == '\0') {
printf("Ingresa el nombre del alumno: ");
gets(alumno);
if (alumno[0] == '\0') {
printf("\nError. El alumno debe de llevar un nombre.");
printf ("\nTrata nuevamente\n\n");
};
};
for (i = 0; i < 4; ++i) {
while (mat[i][0] == '\0') {
printf("Ingresa el nombre de la materia %d: ", i+1);
gets(mat[i]);
if (mat[i][0] == '\0') {
printf("\nError. Las materias deben ser declaradas.");
printf ("\nTrata nuevamente.\n\n");
};
};
while (calif[i] < 0 || calif[i] > 10) {
printf("Ingrese la nota correspondiente a esta materia (0-10): ");
scanf("%2.2f", calif[i]);
if (calif[i] < 0 || calif[i] > 10) {
printf("\nError. Debe ingresar una nota válidad entre 0 y 10.");
printf ("\nTrata nuevamente.\n\n");
};
};
};
return 0;
};
该程序似乎运行良好,直到它询问第一门学科的成绩。我放的任何等级都会导致无限循环。我已经搜索过这个问题无济于事。所以,请让我知道我在这里做错了什么。
解决方案
您的代码中有多个问题:
[major]你读到的标记是
scanf("%2.2f", calif[i])
:格式字符串不正确,第一个2
表示最多读取 2 个字节,这.2
是一个错误,因为scanf()
根本不支持精度语法。它应该只是"%f"
,你应该传递目标变量的地址&calif[i]
而不是它的值。此外,您应该测试返回值以检查无效或丢失的输入。main
is或的原型int main()
,缺少的返回类型是过时的语法。int main(void)
int main(int argc, char *argv[])
用足够长的输入字符串读取输入
gets()
是有风险的,因为没有办法防止缓冲区溢出。您应该改用scanf("%39s", alumno)
orfgets(alumno, sizeof alumno, stdin)
并测试返回值来检测输入流的过早结束。的第二个实例也有同样的评论gets()
。
推荐阅读
- linux - 如何使用 bash 脚本替换文件中某行的某些内容?
- python - 我在连接我正在制作的书店 gui 的前端和后端时遇到问题
- javascript - 简单的 Javascript 将数字从 1 到 11 转换成单词?
- python - 具有多个条件的 pyarrow 数据集过滤
- flutter - 如何从 Bottomnavigationbar 类访问 tabcontroler 到 tabBar_view 类?
- c - 数组写入时出现分段错误
- android - 如何只触发 onPrepareOptionsMenu 而不是 onCreateOptionsMenu?
- python - 程序正在打印内存值而不是实际值
- python-3.x - Selenium Python 和 Beautiful Soup 找不到带 href 的正确元素?
- dendrogram - 投影水平树状图