Как исправить - неожиданный вывод с использованием getchar () и do-while - PullRequest
0 голосов
/ 27 марта 2019

Я пытаюсь создать простой код, который будет считывать символ из ввода и выполнять «правильный» или «неправильный ввод» и снова запускать код, пока не будет введен правильный ввод. Прежде всего, это не работает для заглавной буквы X. Другая проблема, которую я хочу исправить, заключается в том, что после неправильного ввода я должен нажать клавишу ввода, чтобы получить сообщение «Enter x», вместо того, чтобы вводить сразу после неверного сообщения ввода.

#include <stdio.h>
int main()
{
         do
         {
            printf("Enter x\n");
            if (getchar()=='x'|| getchar()=='X')
            {
            printf("Entered char is X\n");
            return 0;
            }
            else
            {
            printf("Input incorrect! Please try again!!!\n");
            }
         }
         while (getchar()!='x' || getchar()!='X');
     return 0;
 }

Ответы [ 3 ]

0 голосов
/ 27 марта 2019

Когда вы нажимаете клавишу ENTER, символ новой строки \n помещается во входной буфер. Вам нужно использовать этот символ новой строки, чтобы прочитать следующий символ.
Также вы читаете два раза, что в данном случае не нужно. Таким образом, ваш код должен быть таким

#include <stdio.h>
int main()
{
         char inp;
         do
         {
            printf("Enter x\n");
            inp = getchar();
            getchar(); // reading the newline character '\n'
            if (inp == 'x'|| inp =='X')
            {
               printf("Entered char is X\n");
               return 0;
            }
            else
            {
               printf("Input incorrect! Please try again!!!\n");
            }
         }
         while (inp !='x' || inp !='X');
     return 0;
 }

p.s Нет необходимости помещать проверку условий в цикл while, поскольку вы возвращаете условие if. while(true) будет работать нормально. Спасибо @bruno за то, что указал на это.

0 голосов
/ 27 марта 2019

В вашем коде:

if (getchar()=='x'|| getchar()=='X')

getchar () вызывается дважды.

Вместо этого вы должны написать это так:

char c = getchar();
if (c=='x'|| c=='X')

для второй части, если ваша цель - напечатать сообщение в новой строке, просто измените ваш printf на:

printf("\nInput incorrect! Please try again!!!\n");
0 голосов
/ 27 марта 2019

Вам необходимо сохранить ввод в переменной, в противном случае вы продолжаете запрашивать ввод несколько раз подряд для каждого getchar вызова.

По странным историческим причинам getchar фактически возвращает int, так как значение EOF, которое может быть возвращено из него, является int. Таким образом, переменная должна быть int.

И, наконец, каждый раз, когда пользователь нажимает клавишу ввода, к входному потоку добавляется невидимый символ перевода строки \n. Этот персонаж бесполезен, поэтому вы должны выбросить его с дополнительным чтением.

#include <stdio.h>

int main (void)
{
  int input;

  do
  {
    printf("Enter x\n");
    input = getchar();
    getchar(); // extra getchar to chew up line feed from stdin

    if (input=='x'|| input=='X')
    {
      printf("Entered char is X\n");
    }
    else
    {
      printf("Input incorrect! Please try again!!!\n");
    }
  } while (input!='x' && input!='X'); 

  return 0;
}

Обратите внимание, что противоположностью input=='x'|| input=='X' является input!='x' && input!='X' (законы де Моргана). «Если вход не является« х », а вход не« X », то цикл".

...