-2

これは、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

4

1 に答える 1

1

コメントを回答としてマークする機能のリクエストは引き続き拒否されるため、上記のソリューションをここにコピーします。

@MayankJain OK、解決しましたありがとう。私はとても愚かで、それについて考えていませんでした。入力はファイルから与えられ、最後の行には「\n」が含まれません。したがって、最後のケースで EOF マーカーをチェックしました。– アビシェカンノジア

于 2014-07-07T08:39:06.430 に答える