c - 我能做些什么来解决这个问题?
问题描述
#include <stdlib.h>
#include <stdio.h>
main()
{
float n1, n2, n3, m;
int op;
do{
printf("Digite a primeira nota: ");
scanf("%f", &n1);
printf("Digite a segunda nota: ");
scanf("%f", &n2);
m = ((n1 + n2) / 2);
printf("%.2f", m);
printf("\nDeseja calcular novamente?\n 1 - SIM\n 2 - NAO\n"); scanf("%d", op);
} while (op == 1);
}
这是我的代码,我希望当用户在最后一次 scanf 中输入“1”时它会重新运行我做错了什么?
解决方案
这个:
scanf("%d", op);
是即时未定义的行为;您需要像其他调用一样传递地址(即&op
)。您需要寻找编译器警告,他们通常会发现这些东西,即使从纯粹的原型中不可能,scanf()
但需要启发式。
scanf()
也就是说,这种使用on的逐场输入stdio
是脆弱的。最好使用读取整行fgets()
然后解析字符串。请注意,它scanf()
可能会失败,并且您不会检查它。如果有人输入duck
最终提示,op
则永远不会被分配一个值,并且在其中读取它do{}while
也是未定义的行为。
推荐阅读
- html - 我们可以在不下载包装的情况下编辑引导 css 样式吗?
- java - HashMap 不写入数据库
- python - pycharm在两台电脑之间克隆同一个项目的github时找不到解释器
- php - 使用 domdocument 和 preg_replace_callback 在 html 中设置标签
- java - 尝试使用静态方法初始化列表,但访问时项目为空
- fortran - 在fortran中将列附加到现有文件
- php - PHP - 如果孩子有一个私有父方法的实现,它是否会被“覆盖”?
- php - PHP 脚本可以充当 SOCKS 代理服务器吗?
- windows - 为什么 Visual Studio 构建工具安装程序会立即返回而不安装任何东西?
- flutter - 自定义颜色颤振主题