Чтение ввода из getchar (), дающего неожиданные результаты - PullRequest
0 голосов
/ 03 ноября 2018

У меня есть функция, которая читает ПИН-код с терминала и сохраняет ПИН-код и длину ПИН-кода в переданных переменных. При первом вызове функции я получаю ожидаемый PIN-код и введенную длину PIN-кода. Однако при втором вызове этой функции первый символ опускается.

/*
 * Function : read_pin(char *pin,int *pin_len)
 * Description : Read entered PIN and stores PIN in pin and pin length in pin_len
 */
int read_pin(unsigned char *pin,unsigned int *pin_len)
{
    int err = EXIT_SUCCESS;
    char ch;

    fflush(stdout);

    /* Pause to get pin (if removed, input is not read from terminal)*/
    getchar();     // i think,this is causing PROBLEM

    while( ((ch = getchar()) != '\n') )
    {
        pin[*pin_len] = ch;
        (*pin_len)++;
    }

    /* If newline at the end of the pin. You'll have to check that */
    if( pin[*pin_len-1] == '\n' )
    {
        pin[*pin_len-1] = '\0';
    }

    exit:
        return err;
}

Вызов этой функции:

printf("\nSelect session : ");
scanf("%d", &option);

printf("\nEnter old PIN: ");
read_pin(old_pin, &old_pin_len); // input: "1234" got: "1234"

fflush(stdout);

printf("\nEnter new PIN: ");
read_pin(new_pin, &new_pin_len); //input: "12345" got: "2345" (1 is omitted)

Может кто-нибудь объяснить мне, почему у меня такое поведение и как это исправить?

Ответы [ 3 ]

0 голосов
/ 03 ноября 2018

Перемещение 1-го getchar() из read_pin()

int read_pin(unsigned char *pin,unsigned int *pin_len)   
{
  int err = EXIT_SUCCESS;
  int ch;  /* getchar() returns int! */

  fflush(stdout);

  /* Pause to get pin (if removed, input is not read from terminal)*/

  while( ((ch = getchar()) != '\n') )

и поместите его сразу после вызова scanf, прежде чем он вызовет read_pin() в первый раз.

  printf("\nSelect session : ");
  scanf("%d", &option);
  getchar();
0 голосов
/ 03 ноября 2018

Вам нужно getchar сразу после scanf

Следовательно

int read_pin(unsigned char *pin,unsigned int *pin_len)
{
    int err = EXIT_SUCCESS;
    char ch;

    fflush(stdout);

   ...........
    getchar();     // Remove this line

    .........

    exit:
        return err;
}

Поместите его сразу после scanf

 printf("\nSelect session : ");
  scanf("%d", &option);
  getchar();

Угадай работу.

Поскольку old_pin_len и new_pin_len действуют как индексы, инициализируют их как 0.

int old_pin_len = 0;
int new_pin_len = 0;
0 голосов
/ 03 ноября 2018

Вам нужно использовать завершающий символ новой строки, прежде чем читать 2-й PIN-код. Например, простой getcher() между двумя вызовами read_pin() даст вам интересные результаты.

Когда вы вводите, вы нажимаете Enter позже. Это «enter» - символ новой строки, который с нетерпением ждет, когда его уничтожат.

...