scanf () и очистить входной буфер в одной функции в C? - PullRequest
0 голосов
/ 29 января 2019

У меня есть следующая идея:

У меня есть функция для очистки буфера ввода:

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

Вместо записи для каждого ввода

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

Iхочу одну функцию, которая содержит оба.Примерно так:

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 Ответ

0 голосов
/ 29 января 2019

Вы не можете использовать scanf с va_list.Вместо этого вам нужно использовать vscanf.

Кроме того, я вынужден отметить, что в целом вам почти всегда следует избегать использования scanf / vscanf целиком; общеизвестно трудно использовать правильно.Вместо этого вы должны прочитать строку ввода с помощью fgets (или getline, если доступно), а затем использовать sscanf в строке.

...