首页 > 解决方案 > 我可以使用 getchar() 来清除 scanf 和 fgets 之间的缓冲区吗?

问题描述

我有这个功能,它运行良好,但我想知道 getchar 的使用是否正确。我可以做点别的吗?多谢你们。

void addRecord (struct record ** start, int account, char name[], char address[ ]);
{

    printf("Enter your account number:\n");
    scanf("%d", &account);

    getchar();
    printf("Enter your name:\n");
    fgets(name, sizeof name, stdin);
    
    printf("Enter your residential address:\n");
    getaddress(address, sizeof address);
     
}

标签: c

解决方案


getchar()只会从stdin. 要清除stdin缓冲区,您必须使用getchar()直到获得 EOF(文件结尾)或新行。因此,与其调用getchar()一次,不如将其称为一个循环,如下所示:

int c;
do {
    c = getchar();
} while (c != EOF && c != '\n');

注意 的值EOF是-1,所以你必须使用int它来处理它,因为它char被限制在 0 到 255 的范围内。

感谢 David Ranieri,EOF 的值可以(并且通常)超出 支持的范围char,因此您应该使用int(或short)来处理 EOF。

您可以将此代码放在一个函数中,就像clear_stdin您需要多次重用此代码一样。


推荐阅读