【问题标题】:Stop scanf loop if user enters a specific number (Not working) C如果用户输入特定数字,则停止 scanf 循环(不工作) C
【发布时间】:2015-02-25 15:30:21
【问题描述】:

我查看了多种解决方案,但没有一个对我有用。

我要求用户在循环中输入数字,但如果用户输入特定数字,则循环应该中断。

这是我到目前为止所得到的。

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

#define MAXNUMBERS 5

int getNumbers(int array[])
{
  int i;
  int n = 0;
  printf("Enter max. %d numbers, enter empty line to end:\n", MAXNUMBERS);

  for (i = 0; i < MAXNUMBERS; i++)
  {
    scanf("%d", &array[i]);
    fflush(stdin);
    n++;
    if (array[i] == '5')
    {
      break;
    }
  }
  return n;
}

int main()
{
  int array[MAXNUMBERS];
  int amount_numbers;
  amount_numbers = getNumbers(array);

  printf("Numbers entered: %d\n", amount_numbers);
  printf("First three: %d %d %d", array[0], array[1], array[2]);

  return 0;
}
  • 输入:

    1  
    5  
    4  
    3  
    2  
    
  • 输出:

    Numbers entered: 5  
    First three: 1 5 4  
    

如果用户输入5,循环应该会中断。

我以 5 为例,稍后我希望它与空行有关。但它甚至不适用于5

它只是在用户输入5后不断提示用户输入另一个数字。

【问题讨论】:

  • 如果我稍后在我先输入 9 时执行此操作:if (array[0] == 9) { printf("Success\n"); } 它有效。所以错误一定在其他地方。
  • fflush(stdin) 是未定义的行为。不要使用它。
  • 建议我可以改用什么?我想防止用户一次输入多个数字。下面有人有解释。
  • @LorenzLeitner 你的意思是2 数字还是2 整数?
  • 您可以使用fgets()strtol() 进行检查。

标签: c loops compare scanf


【解决方案1】:

实际的问题是'5' != 5,前者是字符5,实际上是它的ascii值,后者是数字5,因为您正在读取整数,即使用"%d"说明符scanf()你应该使用5,但是如果它只是一个int变量会更好,你可以在循环开始之前将它初始化为你喜欢的任何数字。

无论如何,您的循环都是错误的,因为如果用户输入一个非数字值,那么您的程序将调用未定义的行为。除了你已经用fflush(stdin) 调用了未定义的行为,所以

删除fflush(stdin)1

7.21.5.2 fflush 函数

  1. 如果流指向输出流更新其中最近的操作不是输入,fflush 函数会导致该流的任何未写入数据被传递到主机环境以写入文件;否则,行为是 未定义。

因此,对于stdin 之类的输入流,或者即使输入了最近的操作,该行为也是未定义

您必须检查该值是否被正确读取,然后检查循环条件是否等于您要停止循环的值,试试这个

int readNumber()
{
    int value;
    printf("input a number > ");
    while (scanf("%d", &value) == 1)
    {
        int chr;
        printf("\tinvalid input, try again...\n");
        do { /* this, will do what you thought 'fflush' did */
            chr = getchar();
        } ((chr != EOF) && (chr != '\n'));
        printf("input a number > ");
    }
    return value;
}

int getNumbers(int array[])
{
  int i;
  int stop = 5;

  printf("Enter max. %d numbers, enter empty line to end:\n", MAXNUMBERS);

  array[0] = 0;
  for (i = 0 ; ((i < MAXNUMBERS) || (array[i] == stop)) ; i++)
    array[i] = readNumber();

  return i;
}

1这是来自 C11 草案 1570 的引述。

【讨论】:

  • 谢谢,希望我能投票。这两个功能是相连的还是只是选项?编辑:我刚刚意识到 getNumbers() 调用 readNumber(),我的错。
  • @LorenzLeitner 有哪些功能?
  • 感谢您的广泛回答,我将对其进行调查并尝试使其像这样工作。
【解决方案2】:
if (array[i] == '5')

您正在检查array[i] 是否等于字符 '5'ASCII value

删除'' 使其与整数5 进行比较。

【讨论】:

  • 是的,我刚刚意识到了!
【解决方案3】:

您正在检查一个整数是否等于字符“5”,然后将其转换为 ascii 值“5”。

试试这个:

if (array[i] == 5)

【讨论】:

  • 是的,我刚刚意识到!谢谢
【解决方案4】:

无视一切!

我应该写的

if (array[i] == 5)

没有引号!

我是个白痴!

我在这个错误上坐了 2 个小时...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 2018-10-19
    • 2016-03-14
    • 1970-01-01
    相关资源
    最近更新 更多