1

我已经为关于 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;
}
4

3 回答 3

5
scanf("%ld %d",&a,&b);

使用未初始化的变量会导致 UB。您应该使用&aand&b来扫描变量

于 2015-01-08T16:11:00.760 回答
2

在您的代码中,您有

scanf("&ld %d",a,b);

这意味着您正在尝试将整数输入到 a 和 b 值的内存位置。例如让 a = 1234566466 (long int) 和 b = 1234 (int) 的值。因此,1234 是一个内存位置,它位于 RAM 的开头。在该区域加载系统文件。所以你要改变系统行为。这是不允许的。

此外,当编译器为您的程序分配一些内存空间时,您只能直接访问内存段内的内存。但是上面的语句试图访问另一个段。

这就是你得到分段错误的原因。

于 2015-01-08T17:26:03.200 回答
1

您正在将一个整数传递给一个需要指针的函数,scanf因为"%d"说明"%ld"符分别期望int *long int *,并且您传递intand long int,因此当尝试访问整数时,就好像它们是内存地址一样segmentation fault

正确的调用方式scanf正如Gopi所说

scanf("%ld %d", &a, &b);

在那里你传递ab地址而不是它们的值。

于 2015-01-08T16:23:38.297 回答