C 为什么这个程序在输入中间意外停止

C 为什么这个程序在输入中间意外停止,c,unexpectendoffile,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

我已经为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;
}
#包括
#包括
无效编号(长整数a、整数b)
{
INTC;
c=b;
int first[c],last[c],e=1,i;
长整数d;
d=功率(a,a);
对于(i=(c-1);i>=0;i--)
{
最后[i]=fmod(d,pow(10,e));
e++;
}
e=1;
而(d>pow(10,(b-1)))
d/=10;
对于(i=(c-1);i>=0;i--)
{
第一[i]=fmod(d,pow(10,e));
e++;
}
对于(i=0;i
使用未初始化的变量会导致UB。您应该使用
&a
&b
扫描变量


使用未初始化的变量会导致UB。您应该使用
&a
&b
扫描变量您正在将一个整数传递给需要指针的函数,用于
scanf
%d”
%ld
说明符分别期望
int*
long int*
,并且您传递
int
long int
,因此当试图像访问内存地址一样访问整数时,会发生
分段错误

调用
scanf
的正确方法应如Gopi所述

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

在这里,您传递的是
a
b
地址,而不是它们的值。

您传递的是一个整数到一个函数,该函数需要一个指针,用于
scanf
%d“
%ld”
说明符分别期望
int*
long int*
,并且您传递
int
long int
,因此当试图像访问内存地址一样访问整数时,会发生
分段错误

调用
scanf
的正确方法应如Gopi所述

scanf("%ld %d", &a, &b);
在这里,您传递的是
a
b
地址,而不是它们的值。

在您的代码中

scanf("&ld %d",a,b);
这意味着您正试图将整数输入到a和b值的内存位置。例如,让a=1234566466(长整型),b=1234(整型)。因此,1234是一个内存位置,位于加载系统文件的RAM.Tn区域的开始处。因此,您将更改系统行为。这是不允许的

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

这就是为什么在代码中会出现分段错误。

scanf("&ld %d",a,b);
这意味着您正试图将整数输入到a和b值的内存位置。例如,让a=1234566466(长整型),b=1234(整型)。因此,1234是一个内存位置,位于加载系统文件的RAM.Tn区域的开始处。因此,您将更改系统行为。这是不允许的

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


这就是为什么你会遇到分段错误。

你需要帮助我们帮助你。我们不知道你想解决什么问题-你能给我们更多信息吗。所有程序员都需要学习如何找到他们程序中的错误。到目前为止,你做了什么来追踪错误(除了让我们帮你做之外)?我可以在程序中看到一些初学者的错误,但我无法修复它们,因为我不知道您试图实现什么。这行:“scanf(“%ld%d”,a,b);”有一些问题。1)始终检查scanf()返回的值为确保输入/转换操作成功,2)参数必须为“address of”,因此行应为:“scanf”(%ld%d),&a,&b);”3)最好始终以“”开头scanf系列函数的格式字符串,以消耗任何剩余的空白(如换行符)在从用户获取输入之前始终提示,以便用户知道他们需要输入什么。在每个scanf()之前使用printf()可以完成此任务。为便于阅读,请不要将语句放在“{”之后或“}”之前的同一行上'在C中,缩进对代码的执行方式没有影响,为了可读性和可维护性,用大括号“{”和“}包装所有代码块“你需要帮助我们帮助你。我们不知道你想解决什么问题-你能给我们提供更多信息吗?所有程序员都需要学习如何找到他们程序中的错误。到目前为止,你做了什么来追踪错误(除了让我们帮你做之外)?我可以在程序中看到一些初学者的错误,但我无法修复它们,因为我不知道您试图实现什么。这行:“scanf(“%ld%d”,a,b);”有一些问题。1)始终检查scanf()返回的值为确保输入/转换操作成功,2)参数必须为“address of”,因此行应为:“scanf”(%ld%d),&a,&b);”3)最好始终以“”开头scanf系列函数的格式字符串,以消耗任何剩余的空白(如换行符)在从用户获取输入之前始终提示,以便用户知道他们需要输入什么。在每个scanf()之前使用printf()可以完成此任务。为便于阅读,请不要将语句放在“{”之后或“}”之前的同一行上'在C中,缩进对代码的执行方式没有影响,为了可读性和可维护性,用大括号{和}包装所有代码块'