首页 > 解决方案 > 我能做些什么来解决这个问题?

问题描述

#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”时它会重新运行我做错了什么?

标签: cclion

解决方案


这个:

scanf("%d", op);

是即时未定义的行为;您需要像其他调用一样传递地址(即&op)。您需要寻找编译器警告,他们通常会发现这些东西,即使从纯粹的原型中不可能,scanf()但需要启发式。

scanf()也就是说,这种使用on的逐场输入stdio是脆弱的。最好使用读取整行fgets()然后解析字符串。请注意,它scanf()可能会失败,并且您不会检查它。如果有人输入duck最终提示,op则永远不会被分配一个值,并且在其中读取它do{}while也是未定义的行为。


推荐阅读