1

ideoneの干し草の山の問題でを解こうとしましたが、SIGSEGV を取得しています。

これは私のコードです:

    //start
    #include<cstring>
    #include<cstdio>
    #include<vector> 
    using namespace std;


    int *overlap;
    char *pattern;
   //used Knuth morris prat algo
   void calcoverlap()
   {
    overlap[0] = 0;
    unsigned int length,i,len;  
    length=strlen(pattern);

    while(i<length)
    {
        if (pattern[i] == pattern[len])
        {
            len++;
            overlap[i] = len;
            i++;
        }
        else
        {
            if (len != 0)
            {
                len = overlap[len-1];
            }
            else
            {
                overlap[i++] = 0;
            }
        }

    }
   }
    //this is final function for pattern matching
    vector< int > patternmatching(int m)
{
vector< int > V;
int i = 0, j = 0;
char ch;
while(1)
{
ch = getchar();
if(ch == '\n') break;
while(1)
{
if(ch == pattern[j])
{
j++;
if(j == m)
{
V.push_back(i-m+1);
j = overlap[j];
}
break;
}
else if(j == 0) break;
else j = overlap[j];
}
i++;
}
    return V;
    }




   int main()
   {
        int n,i,sz;
        vector<int> V;
        while(scanf("%d",&n)==1)
        {   
            gets(pattern);
            calcoverlap();
            V=patternmatching(n);
            sz = V.size();
           for(i=0; i < sz; i++)
            printf("%d\n",V[i]);
            if(!sz) printf("\n");
            delete[] pattern;
            delete[] overlap;
        }
         return 0;
        }    

通常、このプログラムが正常に実行されているときに、入力をアップロードしているときにのみこのエラーが発生する理由を説明してください。

4

2 に答える 2

2

デバッガーを使用してセグメンテーション違反 (sigsegv を含む) を分離するのは非常に簡単です。

Unix で開発している場合は、コードをデバッガーで実行してください。

  1. -gフラグを使用してコードをコンパイルします。
  2. 次のようにgdbでコードを実行します- gdb a.out(またはプログラムの名前)
  3. 走る: (gdb) run
  4. プログラムはセグメンテーション違反でクラッシュします。発生した正確な行番号が表示されるはずです。bt入力するかwhere、トレースバックする必要がある場合があります。

IDE ではさらに簡単です。通常、デバッグ シンボルを探してデバッグします。デバッグ シンボルは、多くの場合、バグ (Eclipse など) によってグラフィカルに表されます。私はあなたが使用している IDE に精通していないので、おそらく問題がある場合は、誰かがその IDE に固有の回答を投稿できます。

于 2013-05-15T22:10:17.477 に答える