关于MFC中CString的用法小结
2015-08-17 17:19
477 查看
今天被两个问题折腾了好久,一个是关于结构体数组传递值的问题,就是不知道结构体指针传递形参到子函数后,如何被子函数分解并继续使用,测试过程中老是只能在结构体数组的第一个元素进行操作,后面的操作就会提示“访问越界”之类的提示,真是伤透了脑筋。
第二个问题是关于遇到结构体数组不知道如何直接进行传递值的问题,我思考了很久,也查阅了不少资料,终于找到了下面一条比较麻烦的方法,不过测试基本可行,先贴上代码:
#include <afx.h>
#include <iostream>
using namespace std;
typedef struct
{
CString ni;
CString bi;
}MyStruct,s123;
LPBYTE getInfo()
{
CString mt = L"nihao";
WCHAR *tmep = (WCHAR*)malloc(100);
LPBYTE tem123 = (LPBYTE)tmep;
wsprintf((WCHAR*)tmep, L"%s", mt.GetBuffer());
tmep += (mt.GetLength()+1);
wsprintf((WCHAR*)tmep, L"%s", mt.GetBuffer());
return tem123;
}
void main()
{
DWORD nih = sizeof(MyStruct);
LPBYTE ni = getInfo();
wcout << (WCHAR*)ni << endl;
DWORD temp1 = (wcslen((wchar_t*)ni) + 1)*sizeof(WCHAR);
wcout << (WCHAR*)(ni + temp1) << endl;
MyStruct me;
me.ni = (WCHAR*)ni;
me.bi = (WCHAR*)(ni + temp1);
}
上面这个程序的大致作用如下:
1、测试CString数组自身在分配时是否会默认在字符串末尾加上'\0',这样以方便sprintf函数能够将很多字符串格式化到一个分配好的地址空间里。
2、测试指针返回问题和局部变量的生命周期,经测试发现在子函数中用如下方式定义变量时,在函数返回后内存会被销毁。
当然,按照传统方式,例如下面用指针作为形参传递并在子函数赋值的方式也是可行的:
3、测试获取的字符串如何赋值给CString类型,证明如下方式可行:
当然,这只是我此时实验出的方法之一,并不代表唯一,希望读者能自我挖掘。
第二个问题是关于遇到结构体数组不知道如何直接进行传递值的问题,我思考了很久,也查阅了不少资料,终于找到了下面一条比较麻烦的方法,不过测试基本可行,先贴上代码:
#include <afx.h>
#include <iostream>
using namespace std;
typedef struct
{
CString ni;
CString bi;
}MyStruct,s123;
LPBYTE getInfo()
{
CString mt = L"nihao";
WCHAR *tmep = (WCHAR*)malloc(100);
LPBYTE tem123 = (LPBYTE)tmep;
wsprintf((WCHAR*)tmep, L"%s", mt.GetBuffer());
tmep += (mt.GetLength()+1);
wsprintf((WCHAR*)tmep, L"%s", mt.GetBuffer());
return tem123;
}
void main()
{
DWORD nih = sizeof(MyStruct);
LPBYTE ni = getInfo();
wcout << (WCHAR*)ni << endl;
DWORD temp1 = (wcslen((wchar_t*)ni) + 1)*sizeof(WCHAR);
wcout << (WCHAR*)(ni + temp1) << endl;
MyStruct me;
me.ni = (WCHAR*)ni;
me.bi = (WCHAR*)(ni + temp1);
}
上面这个程序的大致作用如下:
1、测试CString数组自身在分配时是否会默认在字符串末尾加上'\0',这样以方便sprintf函数能够将很多字符串格式化到一个分配好的地址空间里。
2、测试指针返回问题和局部变量的生命周期,经测试发现在子函数中用如下方式定义变量时,在函数返回后内存会被销毁。
CString mt = L"nihao";而用下面方式定义变量时,函数返回时变量会被销毁,但地址空间内的数据不会被销毁,这就能被我们在返回主调函数地址时使用。
WCHAR *tmep = (WCHAR*)malloc(100);
当然,按照传统方式,例如下面用指针作为形参传递并在子函数赋值的方式也是可行的:
LPBYTE getInfo(DWORD *am) { DWORD ba = 2; *am = ba; } void main() { DWORD i = 0; getInfo(&i); }
3、测试获取的字符串如何赋值给CString类型,证明如下方式可行:
MyStruct me; me.ni = (WCHAR*)ni; me.bi = (WCHAR*)(ni + temp1);
当然,这只是我此时实验出的方法之一,并不代表唯一,希望读者能自我挖掘。
相关文章推荐
- string,CString,char*之间的转化
- CString之getbuffer()
- VC 判断CString字符串中各位是数字,大小写字母,符号,汉字
- CString ,BSTR ,LPCTSTR之间关系和区别
- c++ CString::GetBuffer()
- CString 成员函数用法大全(转)
- CString TO CTime 实现函数
- LPTSTR CString 相互转换 CString char * 相互转换
- _bstr_t 类型,BSTR类型和CString类型到底有什么区别
- 将csv文件读入到数组里
- 字符串转换成整数--一句话
- CString和std::wstring互转,LPCTSTR和std::wstring互转
- CString与其他几种常用类型的转换(控件的变量值都是CString类型的)
- CString的一些应用
- 认识C/C++之字符串
- [Leetcode Solution] Reverse Words in a String
- CString与string,wchar与char,wstring与string的相关转换问题
- string用法详解
- 计时器 进度条
- MFC中如何将CString转化为char类型