【问题标题】:c - need an alternative for fflushc - 需要 fflush 的替代品
【发布时间】:2017-11-02 10:43:13
【问题描述】:

我只被允许使用标准 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");
}

程序应该读取一个大于 1 的数字,如果有任何“错误”输入(如字母),它应该传递一个错误消息。它在我的 windows 电脑上与 fflush 一起工作,程序应该在 Linux 系统上运行。

如何替换 fflush 程序仍然可以工作?因为当我不使用它时,我会陷入无限循环。

输入的数字决定了某行代码在程序的其余部分中使用的频率,这就是我需要数组的原因。

【问题讨论】:

  • 为什么不能使用fflush?这是标准库的一部分。
  • @Iguananaut 是的,但这是错误的用法。
  • 确实,我还没读到那么远。
  • 不要使用scanf,而是使用fgets并自己解析输入。然后你不需要冲洗任何东西。 scanf 对用户输入不是很有用。

标签: c fflush


【解决方案1】:

你可能想要这样的东西:

#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);

【讨论】:

    猜你喜欢
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多