为什么我的程序在我为数组赋值的语句处退出循环?
Why does my program exit the loop at a statement where I'm assigning a value to an array?
我写了一个简单的程序来打印斐波那契数列直到某个值,将它存储在一个数组中并计算它的总和。
#include<stdio.h>
int main()
{
int i,a=0,b=1,c,limit,sum=1;
int fib[limit];
printf("Enter the number of terms: \n");
scanf("%d", &limit);
fib[0]=0;
fib[1]=1;
printf("0 \n");
printf("1 \n");
for(i=2; i<limit; i++)
{
c=a+b;
printf("%d \n",c);
fib[i]=c;
a=b;
b=c;
}
for(i=0; i<limit; i++)
{
sum+=fib[i];
}
printf("The sum is %d", sum);
}
但它直到达到极限才输出系列,我相信这条线可能是原因。
fib[i]=c;
虽然我不确定为什么。你能帮帮我吗?
谢谢
int fib[limit];
printf("Enter the number of terms: \n");
scanf("%d", &limit);
将会
printf("Enter the number of terms: \n");
scanf("%d", &limit);
int fib[limit];
否则,您将使用具有不确定内容的变量声明 VLA。这是未定义的行为。在您的情况下,程序在您尝试使用它时崩溃了。
如果您在 C89
中,则需要使用某个最大值初始化大小,因为 C89 不支持 VLA。
void MAXLIMIT 1000
...
int fib[MAXLIMIT];
int i,a=0,b=1,c,limit,sum=1;
int fib[limit]; printf("Enter the number of terms: \n");
scanf("%d", &limit);
当您声明可变长度数组 fib
时,limit
未初始化。 limit
可以是任何值。这意味着长度是未知的,这肯定会引起问题。这是未定义的行为。
此外,我注意到您用 C89 标记了它。在 1989 年的标准中,可变长度数组是不允许的。任何符合标准的编译器都会拒绝编译它,或者至少会发出严厉的警告。不过,C99 标准中允许使用 VLA。
int i,a=0,b=1,c,limit,sum=1;
printf("Enter the number of terms: \n");
scanf("%d", &limit);
int fib[limit];
如果你这样做,它会工作得很好,并且是完全有效的 C99。由于 VLA 以及 fib
未在 printf
和 scanf
.
之前定义的事实,C89 仍然无法工作
你的代码有一些错误。
限制值包含此行的垃圾值
.....
int i,a=0,b=1,c,limit,sum=1;
....
& 然后你用垃圾值的大小初始化一个数组。
....
int fib[limit];
....
之后你将 'limit' 值作为数组的大小。
....
printf("Enter the number of terms: \n");
scanf("%d", &limit);
....
但您可以在获取极限值之前初始化数组。
所以正确的代码是,
....
printf("Enter the number of terms: \n");
scanf("%d", &limit);
int fib[limit];
....
您在获取数组大小后初始化了数组 'limit'
现在您的代码将完美运行。斐波那契数列的总和已正确计算。
我写了一个简单的程序来打印斐波那契数列直到某个值,将它存储在一个数组中并计算它的总和。
#include<stdio.h>
int main()
{
int i,a=0,b=1,c,limit,sum=1;
int fib[limit];
printf("Enter the number of terms: \n");
scanf("%d", &limit);
fib[0]=0;
fib[1]=1;
printf("0 \n");
printf("1 \n");
for(i=2; i<limit; i++)
{
c=a+b;
printf("%d \n",c);
fib[i]=c;
a=b;
b=c;
}
for(i=0; i<limit; i++)
{
sum+=fib[i];
}
printf("The sum is %d", sum);
}
但它直到达到极限才输出系列,我相信这条线可能是原因。
fib[i]=c;
虽然我不确定为什么。你能帮帮我吗?
谢谢
int fib[limit];
printf("Enter the number of terms: \n");
scanf("%d", &limit);
将会
printf("Enter the number of terms: \n");
scanf("%d", &limit);
int fib[limit];
否则,您将使用具有不确定内容的变量声明 VLA。这是未定义的行为。在您的情况下,程序在您尝试使用它时崩溃了。
如果您在 C89
中,则需要使用某个最大值初始化大小,因为 C89 不支持 VLA。
void MAXLIMIT 1000
...
int fib[MAXLIMIT];
int i,a=0,b=1,c,limit,sum=1;
int fib[limit]; printf("Enter the number of terms: \n");
scanf("%d", &limit);
当您声明可变长度数组 fib
时,limit
未初始化。 limit
可以是任何值。这意味着长度是未知的,这肯定会引起问题。这是未定义的行为。
此外,我注意到您用 C89 标记了它。在 1989 年的标准中,可变长度数组是不允许的。任何符合标准的编译器都会拒绝编译它,或者至少会发出严厉的警告。不过,C99 标准中允许使用 VLA。
int i,a=0,b=1,c,limit,sum=1;
printf("Enter the number of terms: \n");
scanf("%d", &limit);
int fib[limit];
如果你这样做,它会工作得很好,并且是完全有效的 C99。由于 VLA 以及 fib
未在 printf
和 scanf
.
你的代码有一些错误。
限制值包含此行的垃圾值
.....
int i,a=0,b=1,c,limit,sum=1;
....
& 然后你用垃圾值的大小初始化一个数组。
....
int fib[limit];
....
之后你将 'limit' 值作为数组的大小。
....
printf("Enter the number of terms: \n");
scanf("%d", &limit);
....
但您可以在获取极限值之前初始化数组。
所以正确的代码是,
....
printf("Enter the number of terms: \n");
scanf("%d", &limit);
int fib[limit];
....
您在获取数组大小后初始化了数组 'limit'
现在您的代码将完美运行。斐波那契数列的总和已正确计算。