首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C/C++ 中 CString 與 strcpy_s/strcat_s 類型不匹配:正確轉換為 char*

     編輯:程式設計綜合問答

MFC/ATL 專案中常需將 CString 內容複製到 char* 緩衝區。直接傳遞 CString 給 strcpy_s/strcat_s 會導致編譯錯誤 C2664,因為 CString 內部為 Unicode (wchar_t) 而標準 C 函式要求 const char*。

錯誤代碼

CString strTime = t.Format(_T("db%Y%m%d*"));
char s[256];
strcpy_s(s, 256, GetExePath()); // 假設回傳 const char*
strcat_s(s, 256, strTime);      // 錯誤:CString 無法隱式轉為 const char*

解決方法:使用 CW2A (ATL/MFC) 或 CT2A 轉換

#include <atlconv.h> // 需包含

// 將 CString (Unicode) 轉為 ANSI char*
strcat_s(s, 256, CW2A(strTime)); // 或 CT2A(strTime)

// 完整範例
CString m = strTime;
strcpy_s(s, 256, GetExePath());
strcat_s(s, 256, CW2A(m)); // 正確

補充:Unicode 專案建議改用宽字元版本

若專案設定為 Unicode(預設),更推薦使用寬字元安全函式,避免轉換損失:

wchar_t ws[256];
wcscpy_s(ws, 256, GetExePathW()); // 需提供寬字元版路徑
wcscat_s(ws, 256, strTime.GetString()); // CString::GetString() 回傳 const wchar_t*

關鍵點總結

  • CString 內部為 wchar_t* (Unicode)。
  • strcpy_s/strcat_s 接受 char* (ANSI)。
  • 使用 CW2A/CT2A 宏轉換(需 <atlconv.h>)。
  • 或改用 wcscpy_s/wcscat_s 配合 CString::GetString() 保持 Unicode 全程不轉碼。

結語

CString 與標準 C 字串函式的類型不匹配是 MFC 開發常見錯誤。掌握 CW2A/CT2A 轉換或改用寬字元版本,即可輕鬆解決編譯錯誤並避免編碼問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved