приложение аварийно завершает работу strcat_s

Я пробовал и strcat, и 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;
}

Дополнительная информация: я не хочу использовать boost или strings и хочу сохранить это в юникоде (по умолчанию).

0

Решение

Похоже, вы не понимаете, как переменные хранятся в памяти или как работают указатели. В вашем _tmain() у тебя есть char * path указывая на постоянный строковый литерал, который вы передаете в GetFilesInFolders()где это модифицируется. Компиляторы, как правило, позволяют char *s указывать на постоянные строки для обратной совместимости со старыми программами на Си. Вы не можете изменить их. Вы не можете добавить к ним. Компилятор (как правило) помещает их в сегмент только для чтения. Это одна из причин, почему вы получаете исключение.

Ваше целое GetFilesInFolders() неправильно. И, как указал DarkFalcon, вы нигде не выделили места для files, у вас есть это указывает на постоянный строковый литерал.

Получите «Язык программирования C ++» и прочитайте главу 5.

1

Другие решения

Вы назначаете const char* в files, а затем попытаться добавить к нему.

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

Вы не можете изменить константу строкового литерала.

Я бы порекомендовал вам включить предупреждения компилятора и обязательно посмотреть их. Это предупредит вас о назначении const char* к char*, Чтобы исправить это, вы могли бы изменить files быть const, что бы потом strcpy_s больше не компилировать.

2

По вопросам рекламы [email protected]