我只能使用标准的c库,所以fpurge()不是我的选择。

int dim = 0;
int c = 0;

printf("Please enter a number");

while ( (( c = scanf("%d",&dim)) != 1 ) || (dim < 1) || (dim > UCHAR_MAX) )
{
    if (c == EOF)
    {
        return 0;
    }
    fflush(stdin);
    printf("[ERR] Enter a number\n");
    printf("Please enter a number");
}

程序应该读入一个大于一的数字,如果有任何“错误”的输入,如字母,它应该去传递一个错误信息。它与我的windows pc上的fflush一起工作,程序应该在Linux系统上运行。
如何替换程序仍然有效的fflush?因为当我不使用它时,我会进入一个无限循环。
输入的数字决定了在程序的其余部分使用某一行代码的频率,这就是为什么我需要一个数组。

最佳答案

你可能想要这样的东西:

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

int main()
{
  int dim = 0;

  for (;;)
  {
    printf("Please enter a number: ");
    char buffer[30];
    fgets(buffer, sizeof(buffer), stdin);

    char *endpointer;
    dim = strtol(buffer, &endpointer, 10);

    if (*endpointer != '\n' || (dim < 1) || (dim > UCHAR_MAX))
    {
      printf("[ERR] Enter a number\n");
      continue;
    }
    break;
  }

  printf("The number you entered is: %d\n", dim);
}

调用strtol后,endptr指向输入的第一个非数字字符。如果只输入了数字,endptr将指向终止行的\n,否则,如果输入了例如12x,则endptr将指向'x'
您可以通过编写GetNumber函数来改进这一点,这样您就可以只编写
dim = GetNumber();


dim = GetNumber("Please enter a number: ", "[ERR] Enter a number\n", 1, UCHAR_MAX);

10-08 11:30