wcstombs_s无法正常工作

时间:2010-11-19 06:55:45

标签: c++ visual-c++ mfc

我在代码中使用wcstombs_sCString转换为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太长,就像1024字符或我做错了,CString无效。

4 个答案:

答案 0 :(得分:3)

wcstombs_s的第三个参数是输出缓冲区的大小,不是要转换的字符串的大小。如果FolderPath超过1024个字符,则表示内存超出范围,因为wcstombs_s认为它具有比它更大的缓冲区。

请改为尝试:

wcstombs_s(&CharactersConverted, szInputPath, sizeof(szInputPath),
    FolderPath, _TRUNCATE);

答案 1 :(得分:1)

你也错误地使用了memset,你已经互换了第二个和第三个参数。

答案 2 :(得分:0)

应该使用wcstombs_s(& CharactersConverted,szInputPath,1023,FolderPath.GetString(),_ TRUNCATE); 第三个参数是szInputPath的缓冲区大小,即使FolderPath的长度超过1024,这个函数仍然没有抛出异常

答案 3 :(得分:0)

CString是基于UNICODE定义设置的#defined。如果设置,则CString转换为CStringW,否则转换为CStringA。事情直接使用这些类是完全有效的。此外,他们在2之间进行转换。

因此,如果您编写以下代码:

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

就这么简单。

相关问题