首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止scanf()自动将剩余数字插入下一个数组?

如何防止scanf()自动将剩余数字插入下一个数组?
EN

Stack Overflow用户
提问于 2018-02-09 09:31:01
回答 1查看 167关注 0票数 1

我正在制作一个程序来显示有2行和2列的矩阵。如果我输入4个数字,由两个矩阵的空间隔开,程序就能工作。现在,如果我在每个矩阵中输入5个数字,就会得到一些奇怪的输出。对于第一个矩阵,显示是可以的,但是对于第二个矩阵,无论我为第一个矩阵输入多少个数字,留下前四个数字,其他的数字都被插入到第二个矩阵中。

代码语言:javascript
复制
#include <stdio.h>

int main(int argc, char *argv[])
{
    int matr1[2][2], matr2[2][2], i = 0, j = 0;

    printf("\nMATRIX-1: ");
    for (i = 0; i < 2; i++) {
        for (j = 0; j < 2; j++)
            scanf("%d", &matr1[i][j]);
    }

    printf("MATRIX-2: ");
    for (i = 0; i < 2; i++) {
        for (j = 0; j < 2; j++)
            scanf("%d", &matr2[i][j]);
    }

    printf("\nMATRIX-1");
    for (i = 0; i < 2; i++) {
        printf("\n");
        for (j = 0; j < 2; j++)
            printf("%d ", matr1[i][j]);
    }

    printf("\nMATRIX-2");
    for (i = 0; i < 2; i++) {
        printf("\n");
        for (j = 0; j < 2; j++)
            printf("%d ", matr2[i][j]);
    }
    printf("\n");

    return 0;
}

输出:

代码语言:javascript
复制
MATRIX-1: 1 2 3 4 5 
MATRIX-2: 1 2 3 4 5

MATRIX-1
1 2
3 4
MATRIX-2
5 1
2 3

我注意到的另一件事是,如果我在输入过程中按“Enter”,光标就会进入下一行,但是标签“Matrix-1”仍然在原处。

因此,他们使用scanf()只接受一定数量的项的任何简单方法都是如此,这样即使用户输入的内容多于这些项,也不会将其插入到下一个数组中,如果用户输入'Enter‘,则在下一行中显示标签。(我知道这可以用do-while循环来完成,但我不知道如何在两个循环中使用它。)

P.S.-我是C方面的初学者,也许这些问题看起来很愚蠢,但如果我得到帮助,我会非常感激的。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-10 11:33:20

我想我找到了自己的出路。其概念是在读取下一个数组的输入之前以某种方式清除stdin缓冲区。我想这只能是最简单的解决办法。

下面是代码:

代码语言:javascript
复制
#include <stdio.h>
#include <ctype.h>

void clear_stream(FILE *in)
{
    int ch;
    clearerr(in);
    do
        ch = getc(in);
    while (ch != '\n' && ch != EOF);
    clearerr(in);
}

int main(int argc, char *argv[])
{
    int matr1[2][2], matr2[2][2], i = 0, j = 0;

    printf("\nMATRIX-1: ");
    for (i = 0; i < 2; i++) for (j = 0; j < 2; j++) scanf("%d", &matr1[i][j]);
    clear_stream(stdin); // clears stdin

    printf("MATRIX-2: ");
    for (i = 0; i < 2; i++) for (j = 0; j < 2; j++) scanf("%d", &matr2[i][j]);
    clear_stream(stdin);

    printf("\nMATRIX-1");
    for (i = 0; i < 2; i++) {
        printf("\n");
        for (j = 0; j < 2; j++)
            printf("%d ", matr1[i][j]);
    }

    printf("\nMATRIX-2");
    for (i = 0; i < 2; i++) {
        printf("\n");
        for (j = 0; j < 2; j++)
            printf("%d ", matr2[i][j]);
    }
    printf("\n");

    return 0;
}

输出:

代码语言:javascript
复制
MATRIX-1: 1 2 3 4 5 6 7 8 9
MATRIX-2: 1 2 3 4 5 6 7 8 9

MATRIX-1
1 2
3 4
MATRIX-2
1 2
3 4

所以我的第一个问题解决了。我要去解决我下一个关于标签的问题。我一找到解决办法就会更新答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48702672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档