【问题标题】:scanf() and clear input buffer in one function in C?scanf() 并在 C 中的一个函数中清除输入缓冲区?
【发布时间】:2019-01-29 09:30:10
【问题描述】:

我有以下想法:

我有一个清除输入缓冲区的功能:

void clear_inputBuffer()
{
    char c;
    while ( (c = getchar()) != '\n' && c != EOF);
}

而不是为每个输入都写

scanf("%d", &selection);
clear_inputBuffer();

我想要一个包含两者的函数。像这样的:

int terminalInput(const char *format, ...) {
    int count = 0;
    va_list args;
    // Pass variable parameters
    va_start(args, format);
    count = scanf(format, args);
    va_end(args);

    clear_inputBuffer();
    return count;
}

该函数返回 1,但无论正确的输入是什么,“test”也返回 1。

int main(int argc, const char * argv[]) {
    int test;
    printf("number:");
    terminalInput("%d", &test);
    printf("Input: %d\n", test);

    return 0;
}

终端输出:

$ ./a.out
number:345
Input: 1

【问题讨论】:

  • char is _unsigned_ and getchar()` 返回EOF 时,char c; while ( (c = getchar()) != '\n' && c != EOF); 是一个无限循环。使用int ch;

标签: c scanf input-buffer


【解决方案1】:

您不能将scanfva_list 一起使用。您需要改用vscanf

另外,我不得不提一下,一般来说,您几乎总是应该完全避免使用scanf/vscanfnotoriously 很难正确使用。而是将you should read a line of inputfgets(或getline,如果可用)然后使用sscanf 就行了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 2011-12-15
    • 1970-01-01
    相关资源
    最近更新 更多