2013-05-18 43 views
-2

这是codechef问题的代码。gcc上的SIGSEGV错误(Ideone,codechef)在PC上正常工作

#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和gcc中使用Dev-C++默认编译器。

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

任何人都可以帮助我,我是初学者?

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

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

+0

为什么你使用getchar()和所有。整个问题只涉及整数。你能解释一下我得到一条线然后分解为整数的逻辑吗? –

+0

问题invovles处理订单10^250的数字。所以我使用getchar()扫描数组中的所有数字。如果你想看看问题声明这里的链接http://www.codechef.com/problems/GCD2 – abhishekkannojia

+0

你知道它失败的线? – Barmar

回答

1

由于功能要求mark a comment as an answer继续下降,我在这里复制上面的解决方案。

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

相关问题