首页 > 解决方案 > 在 C 中使用 for 循环循环开关

问题描述

我无法让我的 for 循环开关工作。如果用户键入除“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;
}

标签: cfor-loopswitch-statement

解决方案


你的代码有几个问题

第一对

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

因为您不使用已读答案,所以一无所获,请删除这些行

for (; flag == 1;) {

您立即退出循环,因为您将flag初始化为 0,这与您更改flag值的方式不一致,将其与 0 而不是 1 进行比较

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

必须删除scanf,因为您不使用阅读答案

除此之外,因为您想至少执行一次循环以询问答案并对其进行管理,所以使用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 $ 

当然,在您的情况下,循环之后没有任何内容,因此您还可以简化所有删除标志及其管理并将两个第一个break替换为return 0,当然在这种情况下,循环可以是for(;;)while (1)

可能请输入有效答案请重新输入有效答案更好,因为根据定义,用户从不输入有效答案,因此他无法重新输入


推荐阅读