Как принять и одновременно тупой нежелательный ввод?(ЗсапЕ) - PullRequest
1 голос
/ 07 марта 2019

Я столкнулся с небольшой проблемой, когда играю с scanf ... если быть более точным, я хотел бы прочитать весь ввод и затем проигнорировать все остальное.позвольте мне показать вам, что я имею в виду:

#include <stdio.h>

int main(void)
{
    int number_of_iterations = 1;
    int circles = 0;

    scanf("%d", &number_of_iterations);
    unsigned int chr[number_of_iterations][8];

    while (number_of_iterations > circles) {
        scanf("%x", chr[circles]);
        circles++;
    }

    int circles2 = 0;
    while (circles2 < circles){
        printf("%x \n", chr[circles2]);
        circles2++;
    }

    return 0;
}

Это займет X входов, но если я введу что-то вроде этого:

1 1CAAC

      28    EAAEB5
  F489AD95
  CAAC

   28    EAAEB5
F489AD95 F489AD95 EAAEB5
F489AD95 F489AD95

вход будет принимать 1 1CAAC но я хочу, чтобы все остальное читалось, но выбрасывалось ... есть ли какая-либо функция для этого?

Dominiks-MacBook-Pro-2:testing stylez$ ./a.out
1 1CAAC

      28    EAAEB5
  F489AD95
  CAAC

   28    EAAEB5
F489AD95 F489AD95 EAAEB5
F489AD95 F489AD95e30ca8c0Dominiks-MacBook-Pro-2:testing stylez$ 
Dominiks-MacBook-Pro-2:testing stylez$       28    EAAEB5
bash: 28: command not found
Dominiks-MacBook-Pro-2:testing stylez$   F489AD95
bash: F489AD95: command not found
Dominiks-MacBook-Pro-2:testing stylez$   CAAC
bash: CAAC: command not found
Dominiks-MacBook-Pro-2:testing stylez$ 
Dominiks-MacBook-Pro-2:testing stylez$    28    EAAEB5
bash: 28: command not found
Dominiks-MacBook-Pro-2:testing stylez$ F489AD95 F489AD95 EAAEB5
bash: F489AD95: command not found

Отредактированный код от одного ответчика (тестирование кодачтобы понять, как это работает)

#include <stdio.h>

int consume_line(void) {
    int ch;
    while ((ch = fgetc(stdin)) != '\n') && ch != EOF) {
        ;
    }
    return ch;
}

int main(void)
{
    int number_of_iterations = 1;
    int circles = 0;

    int cnt;
    switch (scanf("%d", &number_of_iterations)) {
        case 1: consume_line(); break;
        case 0: consume_line(); /* Decide if code should re-try reading, etc. */ break;
        case EOF:
            printf("hello");// Decide what to do if End-Of-File or rare Low-Level-Input-Error occurred.
    }

    return 0;
}

1 Ответ

3 голосов
/ 07 марта 2019

Я хотел бы прочитать весь ввод, а затем проигнорировать остальные.

Не используйте scanf(), но вводите все данные с помощью fgets(), а затем используйте sscanf(), strtol() и т. Д. Для анализа.

Если необходимо остаться с scanf(), протестируйте его возвращаемое значение и используйте остаток строки.

int consume_line(void) {
  int ch;
  while ((ch = fgetc(stdin)) != '\n'  && ch != EOF) {
    ;
  }
  return ch;
}


....
switch (scanf("%d", &number_of_iterations)) {
   case 1: consume_line(); break;
   case 0: consume_line(); /* Decide if code should re-try reading, etc. */ break;
   case EOF: // Decide what to do if End-Of-File or rare Low-Level-Input-Error occurred.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...