我在代码中使用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
太长,就像1024字符或我做错了,CString
无效。
答案 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();
就这么简单。