用户输入错误处理,直到输入正确

时间:2018-11-04 10:13:07

标签: c loops error-handling while-loop continue

此代码应首先告诉用户输入要检查的三角形数量。如果用户没有输入整数,则程序会告诉用户再次输入整数,直到他输入整数为止。

然后,用户必须为三元组输入一个浮点数。 继续在这里工作正常。但是对于第二个三元组,如果用户未输入整数(例如,他输入2x),它将返回while循环的顶部,请输入第一个三元组的数字。 我该如何编辑代码,使它不会到达while循环的顶部,而是告诉用户再次输入三元组的第二个数字?

#include <stdio.h>
#include <stdlib.h>
#define request "Please enter the number of triangles to check: "
#define triplet1 "Please enter the first number of the triplet: "
#define triplet2 "Please enter the second number of the triplet: "
#define Error "[ERR] Invalid number of triangles.\n "
#define Error2 "[ERR] Invalid number for the triplet.\n"
#define UCHAR_MAX 20

int main ()
{

  int triangles = 0;
  char *end;

  for (;;)
    {
      printf ("%s", request);
      char buffer[30];
      fgets (buffer, sizeof (buffer), stdin);
      triangles = strtol (buffer, &end, 10);
      if (*end != '\n' || triangles < 1 || triangles > UCHAR_MAX)
    {
      printf ("%s", Error);

      continue;
    }
      break;
    }

  float triplet[3] = { 0.0, 0.0, 0.0 };
  int i = 0;
  while (i < triangles)
    {
      float tmp = 0.0;
      printf ("%s\n", triplet1);
      char buffer[30];
      fgets (buffer, sizeof (buffer), stdin);
      tmp = strtol (buffer, &end, 10);
      if (*end != '\n' || tmp < 1)
    {
      printf ("%s", Error2);
      continue;

    }
      triplet[0] = tmp;
     tmp = 0.0;
      printf ("%s\n", triplet2);

      fgets (buffer, sizeof (buffer), stdin);
      tmp = strtol (buffer, &end, 10);
      if (*end != '\n' || tmp < 1)
    {
      printf ("%s", Error2);
      continue;              // goes back to the top of the while loop 

    }

      triplet[1] = tmp;


      i++;

    }

return 0;
}

2 个答案:

答案 0 :(得分:0)

这是continue语句的预期行为。您需要为此实现内部循环。

如果您想在用户输入正确的值之前接受输入,请尝试以下一种方法: 我没有c编译器,因此无法测试,但希望它应该能工作。如果有任何问题,请告诉我。

while (i < triangles)
{
  float tmp = 0.0;
  char buffer[30];
  whiel(true){
    printf ("%s\n", triplet1);
  fgets (buffer, sizeof (buffer), stdin);
  tmp = strtol (buffer, &end, 10);
  if (*end != '\n' || tmp < 1)
    {
      printf ("%s", Error2);
      continue;
    }
    triplet[0] = tmp;
    break;
  }

 tmp = 0.0;
  while(true){
    printf ("%s\n", triplet2);
  fgets (buffer, sizeof (buffer), stdin);
  tmp = strtol (buffer, &end, 10);
  if (*end != '\n' || tmp < 1)
    {
         printf ("%s", Error2);
        continue;
    }
      triplet[1] = tmp;
      i++;
       break;
    }
  }

答案 1 :(得分:0)

关键字continue的非常明确的定义是,每当在循环体内遇到它时,它将跳过当前迭代的所有剩余语句,并从头开始循环,以进行后续的迭代。 / p>

您要在程序中实现的是,与其从头开始执行循环,不如从头开始执行循环,否则将再次执行一组特定的语句。

可能的解决方法是,您在此处使用goto关键字。在Triplet2块之前创建一个标签,当条件失败时,在该标签上调用goto

label:
printf("%s\n", triplet2);
// other statements here
if(...) {
    ...
    goto label;
}

不过,这只是一种解决方法,而不是一种好的做法。

此外,似乎您正在执行重复的语句块。尝试将它们封装在某些功能中,以提高代码质量和可维护性。