2017-12-13 29 views
0

내 작업에는 접미어 배열을 사용하여 두 개의 txt 파일에서 가장 긴 공통 부분 문자열을 찾는 작업이 포함됩니다. I는 다음했을 : I 코드의 일부를 컴파일 할 때, 그러나두 접미어 배열을 만들려고 할 때 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; 
} 

, I 얻는 제를 포함하는 라인에서의 다음의 에러 플래그-for 루프

스레드 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 파일이 나에게 어떤 문제도주지 않지만 두 번째 문제는 무엇입니까? 나는 어떤 지침을 주셔서 감사하겠습니다. 고마워요!

P. 이것은 내 첫 번째 stackoverflow 질문, 잘하면 충분히 분명했다. 나는 또한 질문 양식에 어떤 의견을 주셔서 감사합니다! : D

+1

크기가 n 인 배열의 경우 액세스 할 수있는 가장 높은 인덱스는'n-1'입니다. 'charArrayA [lengthA]'와'charArrayB [lengthB]'줄은 항상 정의되지 않은 동작 인 배열 끝을지나 한 요소에 접근합니다. –

+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

사용자에게 필요한 올바른 입력을 파악하기 위해 사용자에게 맡겼습니다. 이것은 단순히 null 종료를 보여줍니다. –

+0

당신은 첫 번째 대답으로 해결 되어야만하는 질문에 대한 답을 얻을 수있는 방법을 찾을 수 있습니다. – user4581301