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

时间:2015-02-25 15:30:22

标签: c loops compare scanf

我看过多种解决方案,但它们都不适用于我。

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

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

#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后,它会一直提示用户输入另一个号码。

4 个答案:

答案 0 :(得分:3)

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

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

删除fflush 1

  

7.21.5.2 stdin功能

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

因此,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}}

1 这是C11草案1570的引用。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

您正在检查整数是否等于字符&#39; 5&#39;,然后将其转换为&#39; 5&#39;的ascii值。

尝试使用:

if (array[i] == 5)

答案 3 :(得分:1)

无视一切!

我应该写

if (array[i] == 5)

没有引号!

我是个白痴!

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