【问题标题】:SIGSEGV error on gcc (Ideone, codechef) works fine on pcgcc(Ideone,codechef)上的 SIGSEGV 错误在 pc 上工作正常
【发布时间】:2013-05-18 07:59:10
【问题描述】:

这是 codechef 上的一个问题的代码。

#include<stdio.h>

inline int chkIsDiv(int n1, char* ptr)
{
    int i=0, b=0;
    while(ptr[i] != '\0')    
    {
       b=b*10+(ptr[i]-48);
       b%=n1;
       i++;
    }     
    if(b==0)
       return 1;

    return 0;
}

int main()
{
  int t, a, b=0, i;
  char c[252];

  scanf("%d",&t);
  while(t>0)
  {
    scanf("%d",&a);
    i=0;
    getchar();
    while((c[i++]=getchar()) !='\n');
    c[i-1]='\0';
    if(a!=0 && chkIsDiv(a,c)) printf("%d",a);
    else if(a==0) {
      i=0;
      while(c[i] !='\0') printf("%d",c[i++]-48);
    }
    else
    {
      for(i=a-1; i>=1; i--)
      {
         if(a%i==0) {
            if(chkIsDiv(i,c)) {
                printf("%d",i); 
                break;
            }          
         }         
      }         
    }
    printf("\n");
    t--;          
  }

  //getch();
  return 0;
}

问题是当我在ideone上运行上面的代码时,它编译成功,但是当我输入输入测试用例时,它给出了segmentation fault (SIGSEGV) Runtime Error。 我在ideone上的提交链接:http://ideone.com/qGclvK

同样,在我提交问题时,在 codechef 上,它给出了相同的错误。(我猜是因为两者都使用来自 SPOJ 的相同编译器)。

但是当我在我的机器上运行相同的代码时,它适用于问题中指定的每个输入条件,也适用于极端情况。该代码在 Windows 和 linux 中运行良好。而且我相信我使用的算法是正确的。

我在 windows 中使用 Dev-C++ 默认编译器,在 linux 中使用 gcc。

我知道由于某些无效的内存引用而发生错误,但我无法找到问题出在哪里,哪个语句导致了问题,因为它在我的系统上运行良好。

谁能帮帮我,我是初学者??

[已解决] #thank_to_MayankJain。
解决了。问题是我假设每行末尾都有一个 '\n',但在这种情况下,最后一行将不包含任何 '\n' 所以我现在测试了 EOF 标记,并且工作正常。

这里是修改后的代码http://ideone.com/qGclvK

【问题讨论】:

  • 你为什么要使用 getchar() 等等。整个问题只涉及整数。你能解释一下得到一条线然后分解成整数的逻辑吗?
  • 该问题涉及处理 10^250 的订单数。所以我正在使用 getchar() 扫描数组中的所有数字。如果您想查看问题陈述,请查看链接codechef.com/problems/GCD2
  • 你知道它在哪一行失败了吗?
  • 如果号码可以有250位,则需要声明char c[251]\n留出空间。
  • SPOJ 在最后一行之后没有包含换行符似乎有点奇怪......这意味着它不是正式的文本文件,他们给你作为输入,作为文本文件最后没有换行符不是正式的文本文件。

标签: c gcc segmentation-fault


【解决方案1】:

由于对mark a comment as an answer 的功能请求仍然被拒绝,我在此处复制上述解决方案。

@MayankJain 好的,现在解决了,thanx。我太傻了,没想到。输入来自文件,最后一行不包含任何“\n”。因此,我在最后一种情况下检查了 EOF 标记。 – abhishekkannojia

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    相关资源
    最近更新 更多