清理标准输入缓冲区问题



假设我有以下一段代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
int main() {
    char choice;
    char name[5] = "";
    do {
        printf("a = new name or anything else to quitnChoice: ");
        choice = getchar();
        //not doing any error handling....assuming you only click 'a'
        switch (choice) {
            case 'a':
                getchar();
                printf("Enter a name which is 4 characters or less: ");
                fgets(name, 5, stdin);
                printf("Name: %sn", name);
                char c;
                while ((c = getchar()) != 'n' && c != EOF);
                printf("%c", c);
                c = '';
                break;
            default:
                break;
        }
    } while (choice == 'a');
    printf("Ending.....press enter now");
    getchar();
    return 0;
}

我在这里要测试的是清除缓冲区,当我有超过4个字符输入。当我有一个名字是4个字符或更多的时候,它工作得很好,但是当我遇到3个字符或更少的时候,问题就变成了while循环。它期望从stdin缓冲区中获得getchar(),但这是空的。有什么办法可以解决这个问题?

我们已经在我对你上一个问题的回答的评论中顺便讨论了这个问题。如果缓冲区中有足够的空间,fgets()将使用终止换行符,并将其放入缓冲区中。您可以通过在缓冲区中查找换行符来确定它是否已经这样做了。如果你找到了,那么

  1. 您可能想要删除它-例如,通过将其替换为''

  2. 您应该避免尝试排干输入行的尾部,因为流已经前进到下一行。

检查name是否包含换行符。如果是,则缓冲区中没有任何内容,您不需要刷新它。

    fgets(name, 5, stdin);
    printf("Name: %sn", name);
    if (strchr(name, 'n') == NULL) {
        int c;
        while ((c = getchar()) != 'n' && c != EOF);
    }
  1. 检查fgets()结果。除非代码这样做,否则使用name的内容可能是未定义的行为。避免魔术数字:使用sizeof name .

            // fgets(name, 5, stdin);
            if (fgets(name, sizeof name, stdin) == NULL) Handle_EOF();
    
  2. name[]中寻找电位 'n'

            char *eol = strchr(name, 'n');
    
  3. 如果找到一个,用空字符覆盖,否则消耗行

    的其余部分
            if (eol) {
              *eol = '';
            } else {
              int ch;
              while ((ch = getchar()) != 'n' && ch != EOF);
            }
    
  4. Print name[]

            printf("Name: %sn", name);
    

最新更新