2012-09-25 11 views
0

strcat와 strcat_s를 모두 시도했지만 충돌합니다. 왜 이런 일이 일어나는 지 아는 사람이 있습니까? 문제를 찾을 수 없습니다.응용 프로그램이 처음에 충돌합니다. strcat_s

Crash: "Unhandled exception at 0x58636D2A (msvcr110d.dll)" 
_Dst  0x00ea6b30 "C:\\Users\\Ruben\\Documents\\School\\" char * 
_SizeInBytes 260       unsigned int 
_Src  0x0032ef64 "CKV"     const char * 
available  228       unsigned int 
p   0x00ea6b50 ""     char * 

코드 :

#include <Windows.h> 
#include <strsafe.h> 

extern "C" 
{ 
    char* GetFilesInFolders(LPCWSTR filedir, char* path) 
    { 
     char* files = ""; 

     char DefChar = ' '; 
     char* Streepje = "-"; 
     bool LastPoint = false; 

     WIN32_FIND_DATA ffd; 
     TCHAR szDir[MAX_PATH]; 
     HANDLE hFind = INVALID_HANDLE_VALUE; 
     DWORD dwError = 0; 

     StringCchCopy(szDir, MAX_PATH, filedir); 
     hFind = FindFirstFile(szDir, &ffd); 

     if (INVALID_HANDLE_VALUE == hFind) 
      return ""; 

     do 
     { 
      DWORD attributes = ffd.dwFileAttributes; 
      LPCWSTR nm = ffd.cFileName; 
      char name[260]; 
      WideCharToMultiByte(CP_ACP,0,ffd.cFileName,-1, name,260,&DefChar, NULL); 

      for (int i = 0; i <= 260; i++) 
      { 
       if (name[i] == '.') 
        LastPoint = true; 
       else if (name[i] == ' ') 
        break; 
      } 

      if (LastPoint == true) 
      { 
       LastPoint = false; 
       continue; 
      } 

      if (attributes & FILE_ATTRIBUTE_HIDDEN) 
      { 
       continue; 
      } 
      else if (attributes & FILE_ATTRIBUTE_DIRECTORY) 
      { 
       char* newfiledir = ""; 
       char* newpath = path; 
       char* add = "\\"; 
       char* extra = "*"; 
       strcat_s(newpath, sizeof(name), name); 
       strcat_s(newpath, sizeof(add), add); 
       puts(newpath); 
       strcpy_s(newfiledir, sizeof(newpath) + 1, newpath); 
       strcat_s(newfiledir, sizeof(extra) + 1, extra); 
       puts(newfiledir); 

       size_t origsize = strlen(newfiledir) + 1; 
       const size_t newsize = 100; 
       size_t convertedChars = 0; 
       wchar_t wcstring[newsize]; 
       mbstowcs_s(&convertedChars, wcstring, origsize, newfiledir, _TRUNCATE); 
       LPCWSTR dir = wcstring; 
       GetFilesInFolders(dir, newpath); 
      } 
      else 
      { 
       char* file = path; 
       strcat_s(file, sizeof(name), name); 
       puts(file); 
       strcat_s(files, sizeof(file), file); 
       strcat_s(files, sizeof(Streepje), Streepje); 
       puts(files); 
      } 
     } 
     while (FindNextFile(hFind, &ffd) != 0); 

     FindClose(hFind); 
     return files; 
    } 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    char* path = "C:\\Users\\Ruben\\Documents\\School\\"; 
    char* filedir = "C:\\Users\\Ruben\\Documents\\School\\*"; 
    size_t origsize = strlen(filedir) + 1; 
    const size_t newsize = 100; 
    size_t convertedChars = 0; 
    wchar_t wcstring[newsize]; 
    mbstowcs_s(&convertedChars, wcstring, origsize, filedir, _TRUNCATE); 
    LPCWSTR dir = wcstring; 
    char* files = GetFilesInFolders(dir, path); 
    return 0; 
} 

추가 정보 : 내가 부스트 또는 문자열을 사용하지 않으려는 내가 유니 코드 (기본값)이 유지하려는.

+0

은 비어 있습니다 ??? 아직 valgrind 시도 했습니까? –

+0

"name"은 비어 있지 않습니다. – para

+1

'add'는'char *'이므로'sizeof (add)'는'sizeof (char *)'와 동일합니다. 솔직히, C 스타일의 문자열을 사용하는 방법을 이해하지 못하는 것처럼 보입니다. –

답변

1

변수가 메모리에 저장되는 방식이나 포인터가 작동하는 방식을 이해하지 못하는 것 같습니다. _tmain()에서 char * path은 상수 문자열 리터럴을 가리키며,이 문자는 GetFilesInFolders()으로 전달되어 수정됩니다. 컴파일러는 char *이 이전 C 프로그램과의 역 호환성을 위해 상수 문자열을 가리키는 경향이 있습니다. 이들을 수정할 수 없습니다. 추가 할 수 없습니다. 컴파일러 (일반적으로)는 이들을 읽기 전용 세그먼트에 넣습니다. 그것이 예외가되는 이유 중 하나입니다.

전체 GetFilesInFolders()이 잘못되었습니다. DarkFalcon이 지적한 것처럼 files에 대한 공간을 할당하지 않았 으면 일정한 문자열 리터럴을 가리키게됩니다.

"C++ 프로그래밍 언어"를 가져와 5 장을 읽으십시오.

2

const char*files으로 할당 한 다음 추가하려고 시도합니다.

char* files = ""; 
// ... 
strcat_s(files, sizeof(file), file); 

상수 문자열 리터럴을 수정할 수 없습니다.

컴파일러 경고를 켜고 살펴볼 것을 권장합니다. 이 경우 const char*char*에 할당하는 것에 대해 경고합니다. 문제를 해결하려면 filesconst으로 변경하면 strcpy_s이 더 이상 컴파일되지 않습니다.

+0

대상이 읽기 전용 메모리에 있음을 제대로 파악합니다. 대상 버퍼의 크기가 충분하지 않은 것도 심각한 문제입니다. –

+0

AFAIK에서 컴파일러 경고가 표시되고 오류 메시지가 표시되지 않습니다. 또한 "파일"과 "파일"은 모두 char *입니다. – para

관련 문제