为什么这个程序在输入的中间意外停止
Why this program stops unexpectedly in the middle of the input
我已经为 codechef (A4) 上的一个问题编写了这段代码....当我给出输入时:
2个
4 2
这个程序在没有进一步输入的情况下意外停止....请有人指出代码中的错误吗?
#include <stdio.h>
#include<math.h>
void number(long int a,int b)
{
int c;
c=b;
int first[c],last[c],e=1,i;
long int d;
d=pow(a,a);
for(i=(c-1);i>=0;i--)
{
last[i]=fmod(d,pow(10,e));
e++;
}
e=1;
while(d>pow(10,(b-1)))
d/=10;
for(i=(c-1);i>=0;i--)
{
first[i]=fmod(d,pow(10,e));
e++;
}
for(i=0;i<c;i++)
printf("%d",first[i]);
printf(" ");
for(i=0;i<c;i++)
printf("%d",last[i]);
printf("\n");
}
int main()
{ int T;
scanf("%d",&T);
while(T--)
{ long int a;
int b;
scanf("%ld %d",a,b);
number(a,b);
}
return 0;
}
scanf("%ld %d",&a,&b);
使用未初始化的变量导致UB。您应该使用 &a
和 &b
来扫描变量
您正在将整数传递给需要指针的函数,对于 scanf
,"%d"
和 "%ld"
说明符分别需要 int *
和 long int *
,并且您传递 int
和 long int
,因此当尝试访问整数时,就好像它们是内存地址一样,会出现 segmentation fault
。
scanf
的正确调用方式如 Gopi 所述
scanf("%ld %d", &a, &b);
你传递 a
和 b
地址而不是它们的值。
在你的代码中你有
scanf("&ld %d",a,b);
这意味着您正在尝试将整数输入到 a 和 b 值的内存位置。例如,让 a = 1234566466 (long int) 和 b = 1234 (int) 的值。因此,1234 是位于 RAM 开头的存储位置。 Tn 那个区域系统文件被加载。所以你要改变系统行为。这是不允许的。
此外,当编译器为您的程序分配一些内存space时,您只能直接访问内存段内的内存。但是上面的语句试图访问另一个段。
这就是您出现分段错误的原因。
我已经为 codechef (A4) 上的一个问题编写了这段代码....当我给出输入时: 2个 4 2
这个程序在没有进一步输入的情况下意外停止....请有人指出代码中的错误吗?
#include <stdio.h>
#include<math.h>
void number(long int a,int b)
{
int c;
c=b;
int first[c],last[c],e=1,i;
long int d;
d=pow(a,a);
for(i=(c-1);i>=0;i--)
{
last[i]=fmod(d,pow(10,e));
e++;
}
e=1;
while(d>pow(10,(b-1)))
d/=10;
for(i=(c-1);i>=0;i--)
{
first[i]=fmod(d,pow(10,e));
e++;
}
for(i=0;i<c;i++)
printf("%d",first[i]);
printf(" ");
for(i=0;i<c;i++)
printf("%d",last[i]);
printf("\n");
}
int main()
{ int T;
scanf("%d",&T);
while(T--)
{ long int a;
int b;
scanf("%ld %d",a,b);
number(a,b);
}
return 0;
}
scanf("%ld %d",&a,&b);
使用未初始化的变量导致UB。您应该使用 &a
和 &b
来扫描变量
您正在将整数传递给需要指针的函数,对于 scanf
,"%d"
和 "%ld"
说明符分别需要 int *
和 long int *
,并且您传递 int
和 long int
,因此当尝试访问整数时,就好像它们是内存地址一样,会出现 segmentation fault
。
scanf
的正确调用方式如 Gopi 所述
scanf("%ld %d", &a, &b);
你传递 a
和 b
地址而不是它们的值。
在你的代码中你有
scanf("&ld %d",a,b);
这意味着您正在尝试将整数输入到 a 和 b 值的内存位置。例如,让 a = 1234566466 (long int) 和 b = 1234 (int) 的值。因此,1234 是位于 RAM 开头的存储位置。 Tn 那个区域系统文件被加载。所以你要改变系统行为。这是不允许的。
此外,当编译器为您的程序分配一些内存space时,您只能直接访问内存段内的内存。但是上面的语句试图访问另一个段。
这就是您出现分段错误的原因。