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

VS2008 C++ 字符數組在 MessageBox 顯示亂碼的修正方案

     編輯:程式設計綜合問答

問題代碼

FILE *pFile = fopen("1.txt", "r");
TCHAR ch[100];
fread(ch, 1, 100, pFile); // 錯誤:第2參數應為元素大小
fclose(pFile);
MessageBox(ch); // 亂碼

根因分析

  1. fread 參數錯誤:fread(ptr, size, count, stream) 中 size 應為單個元素字節數。TCHAR 在 Unicode 構建下為 wchar_t (2 字節),代碼傳 1 導致只讀取一半字節
  2. 文件編碼與構建配置不一致:文件若為 ANSI,Unicode 構建下需轉換;反之亦然
  3. MessageBox 參數類型:Unicode 構建需調用 MessageBoxW 或使用 _T 宏

修正代碼

// 1. 正確計算元素大小
FILE *pFile = fopen("1.txt", "r");
TCHAR ch[100];
fread(ch, sizeof(TCHAR), 100, pFile); // sizeof(TCHAR) 自動適配 ANSI/Unicode
fclose(pFile);

// 2. 確保字符串以 NULL 結尾
ch[99] = _T('\0'); 

// 3. 使用宏自動映射 MessageBoxA/W
MessageBox(NULL, ch, _T("標題"), MB_OK);

寫文件對應修正

FILE *pFile = fopen("1.txt", "w");
TCHAR ch[] = _T("測試字符串");
fwrite(ch, sizeof(TCHAR), _tcslen(ch), pFile); // 同樣使用 sizeof(TCHAR)
fclose(pFile);

關鍵最佳實踐

  • 始終使用 sizeof(TCHAR) 而非硬編碼 1 或 2
  • 配合 _T() / TEXT() 宏處理字符串字面量
  • 文件 IO 建議顯式指定編碼 (如 UTF-16LE 加 BOM),或統一改用 std::fstream + std::wstring
  • 調試時在 Watch 窗口查看內存原始值,確認是否為預期編碼
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved