2017-09-15 3 views
-4

誰でも問題のコードを教えてください。 「 * *スタックが検出スマッシング・コード以下は私にエラーを与える:」それは私に正しい出力を提供しますが、最後に、私はエラーを取得しミリアンペア4以下のコードでエラーが表示されます*** stack smashing detected ***:

私は

として、私は最後に、信号を得るチェックするためにGDBを使用しました__stack_chk_fail()at stack_chk_fail.c:28 28 stack_chk_fail.c:そのようなファイルやディレクトリはありません。

#include <iostream> 
#include <string.h> 
#include <iomanip> 

using namespace std; 

void computeLps (char p[], int n) { 
    int *lps = new int[n]; 
    int len = 0; 
    lps[0] = 0; 
    int i = 1; 
    while(i < n) 
    { 
     /* code */ 
     if(p[len] == p[i]){ 
      len ++; 
      lps[i] = len; 
      i++; 
     } 
     else { 
      if(len != 0) { 
       len = lps[len - 1]; 
      } 
      else{ 
       lps[i] = 0; 
       i++; 
      } 
     } 
    } 

    for (int i = 0; i < n; ++i) 
    { 
     /* code */ 
     cout << lps[i]<<" "; 
    } 
    cout <<endl; 
} 

int main() { 

    char b[] = "ABABDABACDABABCABAB"; 
    char a[] = "ABABCABAB"; 

    strcat (b,"$"); 
    strcat (b,a); 

    //cout << b; 

    computeLps(b,strlen(b)); 
    return 0; 
} 
+3

何も追加するスペースがありません。だからあなたのstrcat呼び出しはスタックに割り当てられた他の変数とデータを上書きします –

+1

C++、Lukeを使用します。 string.hでダウン!文字列でアップ! – user4581301

+0

std :: stringとstd :: vectorを使用してください。 –

答えて

0

bの文字配列を使用したため、スタック上の配列bに割り当てられたメモリは固定されています。これを避けたい場合は、char配列を追加したり、std :: stringを使って試してみたり、このリンクのヒントと連結したりすることができます。 How to concatenate two strings in C++?

std :: stringは、割り当てられたメモリがすべて使用される必要があるときに動的にメモリを割り当て、拡張します。

関連する問題