在C中刷新标准输入缓冲区



这段代码是我正在处理的一个更大的项目的简化,它在一个简单的示例中总结了这个问题。我从用户那里获得输入,他们的名字,然后清除缓冲区中不适合c字符串的任何输入。问题是,在输入名称后,用户必须按enter键两次才能使程序响应,并且因为我使用getchar()来刷新缓冲区,所以在我创建的循环逻辑中有一个明显的误解。我怎样才能防止用户两次输入Enter,换句话说,我错过了什么?谢谢!

#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#define BUFFSIZE 10
int main(void)
{ 
    unsigned char name[BUFFSIZE];
    printf("ENTER YOUR NAME: ");
    fgets(name, BUFFSIZE, stdin);
    name[strcspn(name, "n")] = '';
    //flush the input buffer
    int flush;
    while (flush = getchar() != 'n' && flush != EOF);
    printf("Your name is: %s!n ", name);
    printf("Press enter to continue...");
    getchar();
    return 0;
} 

程序中的问题是您没有区分两种情况:a)用户的输入适合缓冲区,b)输入不适合。区分这两种情况的是缓冲区中是否存在换行符。当您覆盖该字符时,该信息将被销毁:

fgets(name, BUFFSIZE, stdin);
name[strcspn(name, "n")] = '';

我们这里需要的是:

size_t nlcspn = strcspn(name, "n");
bool incomplete = name[nlcspn] == 0;
name[nlcspn] = 0;

现在我们有一个incomplete标志要测试。只有当这个标志通知输入不包含换行符时,我们才能继续使用一个小循环来完成fgets的"get line"操作,该循环扫描直到接收到换行符。(在这种情况下,一些错误恢复可能也是一个好主意,比如通知用户输入太长,并创建一个机会来纠正它)。

另一件要注意的事情是fgets返回一个应该检查的值。如果它返回空指针,则意味着流在任何输入被消耗之前就结束了。问题是,在这种情况下,fgets不把任何东西放入数组。数组保留其先前的值,该值可能是先前的读输入,也可能是由于未初始化的内容而导致的不确定值("垃圾")。

首先,如果没有余数,则不应使用该行的剩余部分,否则将跳过另一行。其次,赋值的优先级低于大多数操作,这意味着flush =
之后求值。getchar() != 'n' && flush != EOF .

在比较赋值结果时,应该加显式括号:
flush = getchar() != 'n'(flush = getchar()) != 'n'
也可以将赋值移到条件语句之外,见下文。

下面的编辑使用strlen获得最后一个字符,并将赋值移到循环中。

#include <stdio.h>
#include <string.h>
#define BUFFSIZE 10
int main(int argc, char *argv[])
{ 
    char name[BUFFSIZE];
    size_t len;
    int c;
    printf("ENTER YOUR NAME: ");
    fgets(name, BUFFSIZE, stdin);
    len = strlen(name);
    if (name[len - 1] == 'n')
        name[len - 1] = '';
    else
        do
            c = getchar();
        while (c != 'n' && c != EOF);
    printf("Your name is: %s!n ", name);
    printf("Press enter to continue...");
    getchar();
    return 0;
} 

我胡乱猜测你的代码是错误在这里:

while (flush = getchar() != 'n' && flush != EOF);

您想要getchar()直到输出缓冲区为'n'或EOF,对吗?然后试试这个:

while (flush = getchar() != 'n' || flush != EOF);

相关内容

  • 没有找到相关文章

最新更新