繁体   English   中英

如果用户输入特定号码,则停止scanf循环(无效)C

[英]Stop scanf loop if user enters a specific number (Not working) C

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

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

这就是到目前为止。

#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后输入另一个数字。

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

无论如何,您的循环是错误的,因为如果用户输入非数字值,则您的程序将调用未定义的行为。 此外,您已经使用fflush(stdin)调用了未定义的行为,因此

清除fflush(stdin) 1

7.21.5.2 fflush功能

  1. 如果流指向输入最新操作输出流更新流,则fflush函数会使该流的所有未写入数据都将传递到主机环境中,并写入该文件中; 否则,行为是不确定的。

因此,对于输入流(如stdin ,甚至是最近的操作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草案的引文。

if (array[i] == '5')

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

删除'' ,使它比较对整数5

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

尝试使用此:

if (array[i] == 5)

忽略一切!

我应该写

if (array[i] == 5)

没有引号!

我是个白痴!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM