C++代码有未知scanf

代码中13行sacnf应在接收0 0 0 0 0 0\n后break,但是运行时需要再输入一次才能break(输入“a”,0,11111,00000均可)改为sacnf(“%d*6”&a&b等等)后则没有问题。是何原因?

img

【以下回答由 GPT 生成】

问题的根本原因是scanf函数在读取输入时会将换行符(\n)留在输入缓冲区中,导致第二次循环时无法正确读取输入。因此,我们需要在每次读取完输入之后,清空输入缓冲区中的换行符。

解决方案如下:

在scanf函数之后,添加一个getchar函数来清空输入缓冲区中的换行符。

#include <stdio.h>
#include <math.h>

int main() {
    int t, sum, s1, s2, i, j, k;
    int a[101][6];
    int b[4] = { 0, 5, 3, 1 };
    int c[101][1];

    for (i = 0; i < 101; i++) {
        sum = 0;
        s1 = 0;
        s2 = 0;
        t = 0;

        for (j = 0; j < 6; j++) {
            scanf("%d", &a[i][j]);
            sum += a[i][j];
        }

        getchar(); // 清除输入缓冲区的换行符

        if (sum == 0) {
            break;
        } else {
            t = a[i][5] + a[i][4] + a[i][3] + ceil(a[i][2] / 4);
            s2 = a[i][3 * 5 + b[3] * 1];

            if (a[i][1] > s2) {
                t += ceil((a[i][1] - s2) / 9);
            }

            s1 = t * 36 - a[i][5] * 36 - a[i][4] * 25 - a[i][3] * 16 - a[i][2] * 9 - a[i][1] * 4;

            if (a[i][0] > s1) {
                t += ceil((a[i][0] - s1) / 36);
            }

            c[i][0] = t;
        }
    }

    for (k = 0; k < i; k++) {
        printf("%d\n", c[k][0]);
    }

    return 0;
}

通过添加getchar(),程序会清除输入缓冲区中的换行符,便可以正常读取输入,使程序在接收到"0 0 0 0 0 0"后立即退出循环并结束。

希望能对你有所帮助!如果还有其他问题,请随时提出。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

%d后面的空格删了,他在等你最后一个空格输入