如何用std::cout输出CString变量而非其内存地址?
解决CString输出内存地址而非字符串内容的问题
出现这个问题的核心原因是:标准库的cout没有为MFC的CString类重载<<输出运算符,所以默认会输出对象的内存地址。以下是几种直接有效的解决方式:
方法1:显式转换为C风格字符串
CString内置了到LPCTSTR的隐式转换(也可以调用GetString()方法),转换后cout就能正确识别并输出字符串内容:
CString a = "a"; CStringArray arr; arr.Add(a); cout << (LPCTSTR)a << endl; cout << (LPCTSTR)arr[0] << endl; // 或者调用GetString()方法,效果一致 cout << a.GetString() << endl; cout << arr[0].GetString() << endl;
方法2:适配Unicode字符集(宽字符场景)
如果你的MFC项目是Unicode字符集(默认配置),CString实际是CStringW(宽字符串类型),此时用wcout替代cout能更好适配:
CString a = L"a"; // 宽字符常量需加前缀L CStringArray arr; arr.Add(a); wcout << (LPCWSTR)a << endl; wcout << (LPCWSTR)arr[0] << endl;
方法3:重载输出运算符(一劳永逸)
如果需要频繁输出CString,可以全局重载std::ostream的<<运算符,之后就能直接用cout输出CString:
#include <iostream> #include <afx.h> std::ostream& operator<<(std::ostream& os, const CString& str) { os << (LPCTSTR)str; return os; } // 后续直接使用即可 int main() { CString a = "a"; CStringArray arr; arr.Add(a); cout << a << endl; cout << arr[0] << endl; return 0; }
内容的提问来源于stack exchange,提问作者NaiTap
相关产品推荐
相关产品推荐

