【问题标题】:Exited with code 139 (Segmentation fault)以代码 139 退出(分段错误)
【发布时间】:2020-10-03 18:10:11
【问题描述】:

程序可以正确编译,但是当我尝试输入任何数字时,它会以错误代码 139 终止。 问题可能出在第二个 for 循环上,因为我注释掉了整个子句,一切正常。

#include <stdio.h>
#include <stdlib.h>

int main()
{
  int t;
  scanf("%d", &t);
  int a[t], b[t];
  for(int i=0; i<t; i++)
  {
    scanf("%d%d", &a[i], &b[i]);
  }

  for(int i=0; i<t; i++)
  {
    int min = 0;
    while(a[i]!=b[i])
    {
      if(a[i]<b[i])
      {
        for(int j=a[i]; j<b[i]; j+=10)
        {
          if(b[i]-j>10)
          {
            min += 1;
            a[i] += j;
          } else
          {
            min += 1;
            a[i] = b[i];
          }
        }
      } else
      {
        for(int j=b[i]; j>a[i]; j-=10)
        {
          if(j-a[i]>10)
          {
            min += 1;
            a[i] -= j;
          } else
          {
            min += 1;
            a[i] = b[i];
          }
        }
      }
    }
    printf("%d\n", min);
  }
  return 0;
}

我还想指出,程序的相互编译显示“分段错误(核心转储)”或只是“分段错误”,这很奇怪。有时它没有显示任何错误,但仍然不接受输入。

编辑:现在当我为 a[i] 和 b[i] 输入第三个输入时,程序会冻结。

【问题讨论】:

  • 你永远不会在 while 循环中改变 a[i] 或 b[i],所以 t 应该永远运行或者根本不运行。
  • t 是什么值?
  • @WeatherVane 由scanf设置。
  • 无法复制。确保您正在运行您认为正在运行的程序。我建议将程序和输入数据复制到在线编译器站点之一并在那里尝试。
  • 什么是?使用scanf() 输入。 scanf() 的返回值是多少?应该是1

标签: c segmentation-fault


【解决方案1】:

您没有在while 循环内更改a[i]b[i]。假设您想在检查完数组的所有位置后退出,您应该引入此条件(将其更改为 for,更容易):

#include <stdio.h>
#include <stdlib.h>

int main()
{
  int t;
  scanf("%d", &t);
  int a[t], b[t];
  for(int i=0; i<t; i++)
  {
    scanf("%d%d", &a[i], &b[i]);
  }

  for(int i=0; i<t; i++)
  {
    int min = 0;
    for(;a[i]!=b[i] && i<t;i++) //Here
    {
      if(a[i]<b[i])
      {
        for(int j=a[i]; j<b[i]; j+=10)
        {
          if(b[i]-j>10)
          {
            min += 1;
          }
        }
      } else
      {
        for(int j=b[i]; j>a[i]; j-=10)
        {
          if(j-a[i]>10)
          {
            min += 1;
          }
        }
      }
    }
    printf("%d\n", min);
  }
  return 0;
}

【讨论】:

  • 好的,改了。我还尝试在前一个 while 循环中更改 a[i] 和 b[i] 值。不再存在分段错误,但输入数组的第三个值,程序会冻结。
猜你喜欢
  • 2017-01-20
  • 2021-04-16
  • 2016-09-13
  • 2019-08-11
  • 2018-12-12
  • 1970-01-01
  • 2017-11-03
  • 2021-03-07
  • 1970-01-01
相关资源
最近更新 更多