【问题标题】:Why this program stops unexpectedly in the middle of the input为什么这个程序在输入中间意外停止
【发布时间】:2015-01-08 16:08:13
【问题描述】:

我已经为 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);'有一些问题。 1) 始终检查 scanf() 的返回值,以确保输入/转换操作成功 2) 参数必须是 'address of' 所以该行应该是:'scanf("%ld %d",&a,&b) ;' 3) 最好始终以' '(空格)开头的 scanf 系列函数的格式字符串以消耗任何剩余的空白(如换行符)
  • 在从用户那里得到输入之前总是提示,这样用户就会知道他们应该输入什么。每个 scanf() 之前的 printf() 都可以完成这项工作。
  • 为了便于阅读,请不要将语句放在同一行的“{”之后或“}”之前
  • 在 C 中,缩进对代码的执行方式、可读性和可维护性没有影响,用大括号“{”和“}”包装所有代码块

标签: c unexpectendoffile


【解决方案1】:
scanf("%ld %d",&a,&b);

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

【讨论】:

    【解决方案2】:

    在你的代码中

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

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

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

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

    【讨论】:

      【解决方案3】:

      您将整数传递给需要指针的函数,对于 scanf"%d""%ld" 说明符分别需要 int *long int *,并且您传递 intlong int,因此,当尝试像访问内存地址一样访问整数时,会出现segmentation fault

      调用scanf的正确方法是Gopi说的

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-31
        • 2020-08-04
        • 2011-11-13
        • 1970-01-01
        • 1970-01-01
        • 2020-08-31
        相关资源
        最近更新 更多