【问题标题】:Handling errors, infinite loops处理错误,无限循环
【发布时间】:2015-12-09 14:03:08
【问题描述】:

这会在输入高度时创建一个类似马里奥的金字塔。

#include <stdio.h>

int main(void)
{
  int height;
  char signal = 'n';

  while (signal != 'y')
  {
    printf("Height: ");
    scanf("%d", &height);

    if (height <= 0)
    {
      printf("Error. Positive #s only. \n");
    }
    else if (height > 23)
    {
      printf("Error. # must be from 0-23. \n");
    }
    else if (height > 0 || height <= 23)
    {
      signal = 'y';
    }
    else
    {
      printf("Can you bulid a pyramid with letters? I thought so... \n");
    }
  }

  int i, j, k;

  for (i = 1; i <= height; i++)
  {
    if (height <= 8)
      printf("\t");
    else if (height <= 16)
      printf("\t\t");
    else if (height <= 23)
      printf("\t\t\t");

    for (k = 0; k < i; k++)
    {
      printf("\b");
    }

    for (j = 0; j <= i; j++)
    {
      printf("#");
    }
    printf("\n");
  }
}

如果用户决定做傻事并输入一个字符串,程序就会进入无限循环。我以为程序会使用 else 语句,但没有。我该如何处理?

【问题讨论】:

  • 请编辑您的帖子并修正缩进。

标签: c string error-handling


【解决方案1】:

您需要检查scanf的返回值,它返回匹配和分配的输入项的数量。如果您输入文本,它不会匹配任何内容,并且文本会留在输入缓冲区中。所以scanf 不断尝试在循环的每次迭代中读取相同的非匹配数据。

通过检查返回值,可以判断是否输入了字符串。您还需要通过调用 getchar 来清除输入缓冲区,直到获得换行符为止。

试试这个:

  int items = scanf("%d", &height);

  if (items < 1) {
      int ch;
      printf("Please enter a number\n");
      while (((ch=getchar()) != '\n') && (ch != EOF));
  else if(height <= 0)
  ...

【讨论】:

  • 理想情况下,getchar() 循环也应该检查 EOF,否则会冒无限期运行的风险。
  • @Medinoc 好电话。已编辑。
【解决方案2】:

scanf() 返回一个值,指示成功读取了多少个值。如果为零,则表示无法读取任何内容。您应该使用此值来检查输入中的错误。

【讨论】:

    猜你喜欢
    • 2021-11-21
    • 2012-02-16
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多