Строка wcscat_s не заканчивается нулем

0

Я хочу, чтобы все имя пользователя было выбрано пользователем. Формат возвращаемой строки похож: выбран пользователь папки | filename1 | имя_файла2......

Вот мой код для создания диалога с несколькими выборами, получения выбранных имен файлов и копирования их в буферную переменную. Имена файлов разделяются символом "|"

HWND hDlg = NULL;
wchar_t* buffer = new wchar_t[32768];
void ShowDialog()
{
    OPENFILENAME ofn;
    wchar_t szFile[32768];
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(ofn);
    ofn.hwndOwner = hDlg;
    ofn.lpstrFile = (wchar_t*)szFile;
    ofn.lpstrFile[0] = '\0';
    ofn.nMaxFile = sizeof(szFile);
    ofn.lpstrFileTitle = NULL;
    ofn.nMaxFileTitle = 0;
    ofn.lpstrInitialDir = NULL;
    ofn.Flags =  OFN_ALLOWMULTISELECT | OFN_ENABLESIZING | OFN_EXPLORER;
    if(GetOpenFileName(&ofn) == TRUE)
    {
        if(szFile[ofn.nFileOffset-1] != '\0')
        {
            wcscpy_s(buffer,sizeof(szFile),szFile);
        }
        else
        {
           //Multi-select
           wchar_t* p= szFile;
           int i =0;
           while(*p)
           {
                wchar_t* temp = new wchar_t[1024];
                //Copy p into temp
                wcscpy_s(temp,1024,p);
                if(i==0)
                {
                    //copy folder name into buffer
                    wcscpy_s(buffer,1024,temp);
                }
                else
                {
                   //cat file name with buffer
                   wcscat_s(buffer,1024,temp);
                }
                //seperated folder name and files name with "|"
                wcscat_s(buffer,2,L"|\0");
                i++;
                p += lstrlen(p) + 1;
            }
        }
    }
}

Когда я отлаживаю этот код, ошибка времени выполнения: "Строка не завершена нулем" появляется в виде строки: wscat_s (buffer, 2, L "|\0");

Не могли бы вы объяснить мне, почему и как это исправить.

Спасибо, что помогли

  • 0
    Не будет ли проще использовать строки C ++?
  • 0
    @DavidHeffernan да, я попробую.
Теги:
window

1 ответ

2
Лучший ответ

wcscat_s принимает размер буфера в качестве второго аргумента, а не размер добавляемой последовательности, поэтому он должен быть:

wcscat_s(buffer, 32768, L"|");

вместо. Вы получаете эту ошибку, потому что, конечно, ни один из первых двух символов в вашем буфере не равен "\ 0".

  • 0
    спасибо вам, теперь это работает. Но я не понимаю, почему 1024 является вторым параметром. "Wcscat_s принимает размер буфера в качестве второго аргумента", но когда я отлаживаю размер буфера с помощью sizeof (buffer). Его вывод 4. Пожалуйста, объясните мне.
  • 1
    Ваша buffer переменная является указателем, а не массивом, поэтому sizeof() возвращает размер указателя, который составляет 4 байта в 32-разрядной системе.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню