【问题标题】:C Program While Loop problemC 程序 While 循环问题
【发布时间】:2014-02-20 14:02:36
【问题描述】:

我有一个程序要写,它给我带来了麻烦。

它会询问用户输入,例如建议他们想知道区域和/或表面的形状。这个元素,我已经掌握了。

问题在于,当我尝试添加 while 循环来表示响应无效时,它会弄乱整个程序。

我需要它说,“无效响应,请选择选项 1、2、3 或 4 等。

我正在编写循环如下:

printf("Please enter 1 for area or 2 for surface area: ");
scanf("%i",&menu1);
while(menu1!=1&&menu1!=2) {
  printf("Invalid option. Please enter 1 for area or 2 for surface area: "); 
  scanf("%i",&menu1);
}

现在的问题是当用户做出有效响应时,会出现“无效响应”。如何解决这个问题?

【问题讨论】:

  • 你贴的sn-p代码连编译都编译不了,请贴出真正能编译运行的,遇到你描述的问题
  • printf("面积请输入1,表面积请输入2:"); scanf("%i",&menu1); while(menu1!=1&&menu1!=2) { printf("无效选项。请输入 1 表示面积或 2 表示表面积:"); scanf("%i",&menu1); }
  • 道歉。那是从程序中复制的代码。
  • 我认为您的键盘有问题。 " " - 这是一个空格字符,因此您可以将其复制粘贴到您的代码中。
  • 总是测试来自scanf()的返回值;否则,您将不知道它何时告诉您它无法解释输入。 if (scanf("%i", &menu1) != 1) { …error; could not read integer… }。例如,如果用户键入一个字母,您的代码将永远陷入循环,scanf() 报告“我无法转换任何内容”,而您告诉它“再试一次”。

标签: c loops


【解决方案1】:

以下对我有用:

#include <stdio.h>

int main(void) {
  int menu1; // Make sure this is declared 

  printf("Please enter 1 for area or 2 for surface area: ");
  scanf("%i", &menu1);

  while((menu1 != 1) && (menu1 != 2)) {
    printf("Invalid option. Please enter 1 for area or 2 for surface area: ");
    scanf("%i", &menu1);
  }

  return 0;
}

你没有发布你的全部代码,但我假设你在scanf 中使用它之前没有声明menu1。这肯定会引起问题。

更新

正如@John 在 cmets 中指出的那样,您可以通过使用 do-while 来消除一些冗余,以确保循环始终至少运行一次。

正如@Cqnqrd 所指出的,如果您输入非整数值,scanf 可能会导致一些无限循环问题,其原因在here 中有详细说明。您可以使用 fgets 和 atoi 比 scanf 更好地处理非整数输入(防止像 'aa' 这样的输入出现无限循环)。

#include <stdio.h>
#include <stdlib.h>

int main(void) {
  int menu1 = 0;
  char input[256];

  do {
    printf("Please enter 1 for area or 2 for surface area: ");
    fgets(input, 256, stdin);
    menu1 = atoi(input);

    if ((menu1 != 1) && (menu1 != 2)) printf("Invalid entry. ");
  } while ((menu1 != 1) && (menu1 != 2));

  return 0;
}

【讨论】:

  • do while 循环在这里会更有用吗?
  • @John 可能。我尽量保持它与问题的主体相似,同时仍然让它编译。
  • 当输入一个无效的选择(如'aa')时,我的控制台会被printf 语句发送垃圾邮件。
  • @Cqnqrd 不是 C 编程,我猜这是 scanf 被赋予非整数值的错?
  • 是的,见this answer
猜你喜欢
  • 2017-08-11
  • 1970-01-01
  • 1970-01-01
  • 2014-04-01
  • 1970-01-01
  • 2014-11-22
  • 1970-01-01
  • 2022-01-14
  • 2011-06-19
相关资源
最近更新 更多