我看过多种解决方案,但它们都不适用于我。
我要求用户在循环中输入数字,但如果用户输入特定数字,则循环应该中断。
这是我到目前为止所做的。
#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
后,它会一直提示用户输入另一个号码。
答案 0 :(得分:3)
实际问题是'5' != 5
前者是字符5
,实际上它是ascii值,后者是数字5
,因为你正在读整数,即使用"%d"
scanf()
中的5
说明符应该使用int
,但如果它只是fflush(stdin)
变量会更好,您可以将它初始化为您之前喜欢的任何数字循环开始。
你的循环无论如何都是错误的,因为如果用户输入一个非数字值,那么你的程序将调用未定义的行为。此外,您已使用fflush(stdin)
调用未定义的行为,因此
删除fflush
1
7.21.5.2
stdin
功能
- 如果流指向输出流或更新流,其中最近的操作是不输入,fflush函数导致该流的任何未写入数据被传递到主机环境以写入文件;否则,行为是 未定义。
醇>
因此,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)
答案 2 :(得分:1)
您正在检查整数是否等于字符&#39; 5&#39;,然后将其转换为&#39; 5&#39;的ascii值。
尝试使用:
if (array[i] == 5)
答案 3 :(得分:1)
无视一切!
我应该写
if (array[i] == 5)
没有引号!
我是个白痴!
我在这个错误中坐了2个小时......