|
把 CString 类型的字符串赋值给结构体中定义的 char 数组字段 sAccount 和 sToken
好的,您想把 `CString` 类型的字符串赋值给结构体中定义的 `char` 数组字段 `sAccount` 和 `sToken`。这里需要注意的是,`CString` 是宽字符(Unicode)还是多字节字符集(ANSI),以及如何安全地拷贝字符串。
假设您使用的是多字节字符集(MBCS),下面是安全赋值的示例代码:
```cpp
#include <atlstr.h> // CString头文件
#include <cstring> // strncpy_s
struct TAuthAccountInfo
{
int nIndex;
char sAccount[33]; // 32字符 + 1结束符
char sToken[65]; // 64字符 + 1结束符
TAuthAccountInfo()
{
nIndex = 0;
ZeroMemory(sAccount, sizeof(sAccount));
ZeroMemory(sToken, sizeof(sToken));
}
};
void AssignCStringToStruct()
{
TAuthAccountInfo info;
CString csAccount = _T("ExampleAccountName");
CString csToken = _T("ExampleTokenValue1234567890");
// 将CString转换为多字节字符串并安全复制到char数组
// 注意:如果项目是Unicode,需要先转换为多字节编码
#ifdef UNICODE
// Unicode环境下,先转换CStringW到多字节
int nLenAccount = WideCharToMultiByte(CP_ACP, 0, csAccount, -1, nullptr, 0, nullptr, nullptr);
WideCharToMultiByte(CP_ACP, 0, csAccount, -1, info.sAccount, min(nLenAccount, sizeof(info.sAccount)), nullptr, nullptr);
int nLenToken = WideCharToMultiByte(CP_ACP, 0, csToken, -1, nullptr, 0, nullptr, nullptr);
WideCharToMultiByte(CP_ACP, 0, csToken, -1, info.sToken, min(nLenToken, sizeof(info.sToken)), nullptr, nullptr);
#else
// 非Unicode环境,CString本身是多字节,可以直接复制
strncpy_s(info.sAccount, sizeof(info.sAccount), csAccount, _TRUNCATE);
strncpy_s(info.sToken, sizeof(info.sToken), csToken, _TRUNCATE);
#endif
// 现在 info.sAccount 和 info.sToken 已经安全赋值
}
```
### 说明:
1. **Unicode环境**:`CString` 实际是 `CStringW`(宽字符),需要用 `WideCharToMultiByte` 转换成多字节字符串,再复制到 `char` 数组。
2. **非Unicode环境**:`CString` 是多字节字符串,可以直接用 `strncpy_s` 复制。
3. `strncpy_s` 的 `_TRUNCATE` 参数保证不会溢出,自动截断超长字符串,并且保证字符串以 `\0` 结尾。
4. `sizeof(info.sAccount)` 和 `sizeof(info.sToken)` 是数组大小,确保不会越界。
如果您项目是Unicode,建议使用上面Unicode分支的代码;如果是多字节编码,直接用 `strncpy_s` 即可。
|
|