Цикл переключателя для L oop в C - PullRequest
0 голосов
/ 25 марта 2020

Я не могу заставить меня переключиться на работу. Я хочу, чтобы программа повторила вопрос, если пользователь вводит букву, отличную от 'y', 'Y', 'n', 'N'. Может кто-нибудь помочь мне исправить, пожалуйста?

#include <stdio.h>

int main(void) {

  int flag = 0;
  char mstatus;

  printf("Are you married?\n");
  scanf(" %c", &mstatus);

  for (; flag == 1;) {
    printf("Are you married?\n");
    scanf(" %c", &mstatus);
    switch (mstatus) {
    case 'y':
    case 'Y':
      printf("You have answer yes for married");
      flag = 1;
      break;
    case 'n':
    case 'N':
      printf("You have answer no for married");
      flag = 1;
      break;
    default:
      printf("please re-enter a valid answer");
      scanf(" %c", &mstatus);
    }
  }
  return 0;
}

1 Ответ

1 голос
/ 25 марта 2020

у вас есть несколько проблем в вашем коде

Первая пара

printf("Are you married?\n");
scanf(" %c", &mstatus);

ничего не сделано, потому что вы не используете ответ на чтение, удалите эти строки

В

for (; flag == 1;) {

вы немедленно выходите из l oop, поскольку вы инициализировали flag в 0, и это не согласуется с тем, как Вы изменяете значение flag , сравниваете его с 0 вместо 1

In

default:
  printf("please re-enter a valid answer");
  scanf(" %c", &mstatus);

scanf должен быть удален, потому что вы не используете чтение ответа

Из этого, потому что вы хотите сделать l oop хотя бы один раз, чтобы запросить ответ и управлять им, его очень удобнее читать a do ... while

Также добавьте последний символ новой строки при печати чего-либо

Пример:

#include <stdio.h>

int main(void) {

  int flag = 0;

  do {
    char mstatus;

    printf("Are you married?\n");
    scanf(" %c", &mstatus);

    switch (mstatus) {
    case 'y':
    case 'Y':
      printf("You have answer yes for married\n");
      flag = 1;
      break;
    case 'n':
    case 'N':
      printf("You have answer no for married\n");
      flag = 1;
      break;
    default:
      printf("please re-enter a valid answer\n");
    }
  } while (flag == 0);

  return 0;
}

Компиляция и выполнение:

pi@raspberrypi:/tmp $ gcc -Wall d.c
pi@raspberrypi:/tmp $ ./a.out
Are you married?
a
please re-enter a valid answer
Are you married?
y
You have answer yes for married
pi@raspberrypi:/tmp $ ./a.out
Are you married?
d
please re-enter a valid answer
Are you married?
N
You have answer no for married
pi@raspberrypi:/tmp $ 

Конечно, в вашем случае после l oop ничего нет, поэтому вы также можете упростить удаление flag и его управление. t и замените два первых break на return 0 , конечно, в этом случае l oop может быть для (;;) или while (1) et c

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

...