wcstombs_s не работает должным образом - PullRequest
0 голосов
/ 19 ноября 2010

Я использую wcstombs_s в своем коде для преобразования CString в char*. вот код:

  AddItemToListIncludeSubFolder(CString FolderPath, CString Parent)
  {
    char szInputPath[1024]; 

    memset(szInputPath,1024,'\0');
    size_t CharactersConverted=0;

    wcstombs_s(&CharactersConverted, szInputPath, FolderPath.GetLength()+1, 
        FolderPath, _TRUNCATE);
  }

Это вызывает исключение некоторое время. Исключение памяти. wcstombs_s не работает, если CString слишком длинен, как 1024 символа, или я делаю что-то неправильно

Ответы [ 4 ]

3 голосов
/ 19 ноября 2010

Третий параметр wcstombs_s - это размер выходного буфера, , а не - размер преобразуемой строки. Если FolderPath длиннее, чем 1024 символа, вы записываете память за пределы, поскольку wcstombs_s считает, что у нее больше буфер, чем у него.

Попробуйте вместо этого:

wcstombs_s(&CharactersConverted, szInputPath, sizeof(szInputPath),
    FolderPath, _TRUNCATE);
1 голос
/ 27 января 2011

Вы также неправильно используете memset, вы поменяли второй и третий параметры.

0 голосов
/ 21 ноября 2010

CString является #defined в зависимости от того, установлено ли определение UNICODE. Если он установлен, CString переводит в CStringW, иначе в CStringA. Дело в том, что совершенно правильно использовать эти классы напрямую. Кроме того, они выполняют преобразование между 2.

Итак, если вы напишите следующий код:

CStringA ansiAstring( wideString );
char* ansiCStr = ansiString.GetString();

Это так просто.

0 голосов
/ 19 ноября 2010

следует использовать wcstombs_s (& CharactersConverted, szInputPath, 1023, FolderPath.GetString (), _TRUNCATE); третий параметр - это размер буфера szInputPath, даже если длина FolderPath превышает 1024, эта функция по-прежнему не вызывает исключение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...