C 为什么我的循环即使有条件也会终止?

C 为什么我的循环即使有条件也会终止?,c,arrays,loops,break,C,Arrays,Loops,Break,我试图获取用户输入并将其存储在数组Fib[I]中。然后打印Fib[i]数组。当用户输入-1时,循环将退出,程序将结束。但我的代码没有打印或终止 #include <stdio.h> double Fib[50];//globally declared int fib(int n) { int i; for(i=0; i<50; i++) { scanf("%d", &Fib[i]); if(i==-

我试图获取用户输入并将其存储在数组Fib[I]中。然后打印Fib[i]数组。当用户输入-1时,循环将退出,程序将结束。但我的代码没有打印或终止

#include <stdio.h>

double Fib[50];//globally declared  
int fib(int n)
{
    int i;

    for(i=0; i<50; i++)
    {   
        scanf("%d", &Fib[i]); 
        if(i==-1)
         break;
       //printf("numbers entered %d\n", Fib[i]); // <- doesn't terminate if printf is here
    }
        printf("numbers entered %d\n", Fib[i]); //doesn't print anything??

}
int main()
{
    int i, n;
//calling the function
    fib(n);

return 0;

}
预期产出:

Numbers entered 
4
5

这段代码有许多代码编写标准问题,但您似乎是新的,所以我只做了最小的更改,以供您理解

#include <stdio.h>

double Fib[50];//globally declared  
int fib(int n)
{
    int i,j;

    for(i=0; i<50; i++)
    {   
        scanf("%lf", &Fib[i]); 
        if(Fib[i]==-1)
         break;
    }  
    printf("numbers entered \n");
    for(int j=0;j<i;j++)
    {
        printf("%lf\n",Fib[j]);
    }
}
int main()
{
    int i, n;
    fib(n);
    return 0;

}
#包括
双Fib[50]//全球宣布
整数fib(整数n)
{
int i,j;

对于(i=0;i第一个问题:您将
Fib
声明为
double
的数组:

double Fib[50];
但是您可以使用
%d
来读取值,该值用于读取
int

scanf("%d", &Fib[i]); 
int Fib[50];
使用错误的格式说明符调用。您可能希望存储整数,因此将数组更改为
int

scanf("%d", &Fib[i]); 
int Fib[50];
接下来是阵列断开条件:

if(i==-1)
i
是数组索引,范围从0到49,因此这永远不会是真的。当用户输入-1时,您希望停止,该值将位于
Fib[i]

if(Fib[i]==-1)
最后,打印阵列:

printf("numbers entered %d\n", Fib[i]);
这不会打印数组。它只打印
i
的最后一个索引处的元素,该索引处的值将始终为-1。您需要一个单独的循环来打印值:

int j;
printf("numbers entered:\n");
for (j=0; j<i; j++) {
    printf("%d\n", Fib[j]);
}
intj;
printf(“输入的数字:\n”);

for(j=0;ji不会是-1。i是你的循环变量。Fib[i]可能是-1在该循环中,
i
怎么会是负的?另外,
Fib
是一个双精度数组,你告诉
scanf()
为其中的一个元素指定一个int。你的编译器不是在警告你吗?@Shawn用户输入将是-1,这将终止循环,因为我不能是-1。始终打开一组健康的警告,并注意它们。
-Wall-Wextra
如果使用gcc或clang,则很好。我在看到你的代码后进行了更改。对于(i=0;i=0;i++){scanf(“%d”,&Fib[i]);if(Fib[i]=-1)//更改的break;}printf(“输入的数字”);//的新循环(j=0;jI匆忙写下了这篇文章,一些无情的人投票否决了我@Su.she。我编辑过,但我认为(Fib[I]=-1)是否是问题所在now@chux我更改了lf部分,但现在在循环结束后只打印-1.00000。对于(I=0;I=0;I++){scanf(“%lf”),&Fib[I]);if(Fib[I]=-1)//changed break;}printf(“输入的数字%lf\n”,Fib[i]);@Su。她只是确认代码是否工作@Su。她有时会将双精度中的1取为1.000000001,因此1!=1.000000001,所以你可能会得到一个错误,所以我修复了它,但现在它进入了0的无限循环。对于(i=0;i=0;i++){scanf%lf“,&Fib[i]);if(Fib[i]==-1)//changed break;}printf(“输入的数字”);for(j=0;j@Su.she您将
scanf
格式说明符更改为
%lf
,但将
printf
一个保留为
%d
。对所有人使用
double
或对所有人使用
int
。使用
sizeof(Fib)
不正确,因为这是
Fib
中的字节数,而不是元素数。我们使用
i
,因为这是用户输入的最后一个值的索引,所以一旦
j
点击
i
,我们就可以停止。