gcc(Ideone,codechef)上的SIGSEGV错误在pc上正常工作

时间:2013-05-18 07:59:10

标签: c gcc sigsegv

这是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上运行上面的代码时,它成功编译代码,但是当我输入测试用例时,它会给出分段错误(SIGSEGV)运行时错误。 我在ideone上的提交链接:http://ideone.com/qGclvK

同样,在我提交问题时,在codechef上也会出现同样的错误。(我猜两个人都使用SPOJ中的相同编译器)。

但是当我在我的机器上运行相同的代码时,它可以解决问题中指定的每个输入条件以及拐角情况。代码在windows和linux中运行良好。而且我相信我使用的算法是正确的。

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

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

任何人都可以帮我这个,我是初学者吗?

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

以下是修改后的代码http://ideone.com/qGclvK

1 个答案:

答案 0 :(得分:1)

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

@MayankJain好了,现在解决了。我是如此愚蠢,没有想到它。输入来自文件,最后一行不包含任何'\ n'。因此我在最后一种情况下检查了EOF标记。 - abhishekkannojia