为什么此程序在输入中间意外停止

时间:2015-01-08 16:08:14

标签: c unexpectendoffile

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

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

在您的代码中

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

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

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

这就是为什么你会出现segmentatin错误。

答案 2 :(得分:1)

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

调用scanf的正确方法是 Gopi 表示

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

您传递了ab地址而不是其值。