C语言中如何在一个函数中同时使用scanf()和清空输入缓冲区?

4
我有以下想法:
我有一个清除输入缓冲区的函数:
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

1
char是无符号的并且getchar()返回EOF时,char c; while ( (c = getchar()) != '\n' && c != EOF);将成为一个无限循环。请使用int ch; - chux - Reinstate Monica
1个回答

4
你不能使用 scanf 来处理 va_list。你需要使用 vscanf
此外,我觉得有必要提到,通常情况下你应该尽量避免使用 scanf/vscanf;它们非常难以正确使用。相反,你应该使用 fgets(如果可用,也可以使用 getline)读取一行输入,然后对该行进行 sscanf 处理。(这是众所周知的) 请参考示例代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接