2017-12-13 6 views
0

私の仕事は、接尾辞配列を使って2つのtxtファイルで最も長い共通部分文字列を見つけることです。私は次のように行った:2つの接尾辞配列を作成しようとするとEXC_BAD_ACCESSエラーが発生するのはなぜですか?

#include <iostream> 
#include <cstring> 
#include <algorithm> 
#include <fstream> 

int main() { 
    char* charArrayA = charArrayFromTxtFile("~/txt_file1.txt"); 
    char* charArrayB = charArrayFromTxtFile("~/txt_file2.txt"); 

    int lengthA = strlen(charArrayA); 
    int lengthB = strlen(charArrayB); 

    char* suffixArrayA[lengthA]; 
    char* suffixArrayB[lengthB]; 

    for(int i = 0; i < lengthA; i++) { suffixArrayA[i] = &charArrayA[i]; } 
    for(int i = 0; i < lengthB; i++) { suffixArrayB[i] = &charArrayB[i]; } 
    charArrayA[lengthA] = 0; 
    charArrayB[lengthB] = 0; 

    ... 

    return 0; 
} 

をしかし、私は、コードのこの部分をコンパイルしたとき、私はforループSECONDを含む行に次のエラーフラグを取得:

スレッド1:EXC_BAD_ACCESS(コード= 2、アドレス= 0x7ffeef1446e0)参考のため

、私はcharArrayAとcharArrayB作成するために使用する機能がある:それはケースFiのだろう、なぜ

char* charArrayFromTxtFile(std::string fileName) { 
    std::ifstream filename;    // Variable for file 
    int length;       // Number of characters 
    filename.open(fileName); 
    filename.seekg(0, std::ios::end); // Goes to the end of the file 
    length = filename.tellg();   // Location of the end (index, length of file) 
    filename.seekg(0, std::ios::beg); // Go back to the beginning 
    char* charArray = new char[length]; // Allocate a char array of "length" file 
    filename.read(charArray, length); // Write characters from txt file into the char array 
    filename.close(); 

    return charArray; 
} 

誰もが知っています最初のtxtファイルは私に何のトラブルも与えませんが、2番目の問題はありますか?私はどんな指導にも感謝します。大変ありがとうございました!

P.S.これは私の最初のstackoverflowの質問ですので、うまくいけば私は十分に明確でした。問題のフォームでもフィードバックをいただければ幸いです! :D

+1

サイズ「n」の配列の場合、アクセスできる最も高いインデックスは 'n-1'です。 'charArrayA [lengthA]'と 'charArrayB [lengthB]'の行は、配列の末尾を超えて未定義の動作である1つの要素に常にアクセスします。 –

+2

'suffixArrayA [lengthA]'は可変長配列で、標準のC++ではありません。いくつかのコンパイラでは拡張機能としてサポートされていますが、移植可能な構造ではありません。特に、gccはデフォルトでそれをサポートしています。 –

+7

'charArrayFromTxtFile'で既に' std :: string'を使用しているので、なぜあなたが動的配列を所有する生ポインタを返すのか分かりません。別の 'std :: string'を返すだけで、すべてをもっと簡単で安全にすることができます。 –

答えて

2

charArrayfromTxtFile()関数はnullではなく、文字列charArrayを終了します。

charArray[length - 1] = '\0'; 

これは、strlen()で反復処理する前に実行する必要があります。

+0

閉じる: 'char * charArray = new char [length + 1];'そして、 'charArray [length] = '\ 0';'そうでなければ、ファイルの最後のバイトを消去します。 – user4581301

+0

私はそれをユーザーに残して、彼らが必要とする有効な入力を把握しました。これは単純にヌル終了を示します。 –

+0

あなたは、たいていの場合、最初の答えで解決されるはずの質問を取り上げるだけの方法を見つけることが多いでしょう。 – user4581301

関連する問題