我该如何解决这一问题?

问题描述 投票:0回答:1
#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”时重新运行我做错了什么?

c++ c clion
1个回答
1
投票

此:

scanf("%d", op);

是即时未定义的行为;您需要像其他呼叫一样传递地址(即&op)。您需要查找编译器警告,即使从scanf()的原始原型不可能实现,它们也通常会发现这些问题,但是需要启发式。

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

© www.soinside.com 2019 - 2024. All rights reserved.