[英]How do I stop scanf loop after user enters specific amount of integers?
[英]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
功能
- 如果流指向未输入最新操作的输出流或更新流,则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草案的引文。
您正在检查整数是否等于字符“ 5”,然后将其转换为ascii值“ 5”。
尝试使用此:
if (array[i] == 5)
忽略一切!
我应该写
if (array[i] == 5)
没有引号!
我是个白痴!
我在这个错误上坐了2个小时...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.