编程环境:VS2013,MFC
字符变量CStringArray、char*、string、CString
CStringArray 字符串数组类
CStringArray类可以用来存储CString类型的对象,而且它的容量是可以动态增加的。
CStringArray
CObject |
---|
└ CStringArray |
CStringArray类支持CString对象数组。
在使用一个数组之前,使用SetSize来建立它的大小并给它分配内存。如果你不使用SetSize,则向数组中添加元素时将导致数组被频繁地拷贝和分配内存。频繁分配内存和拷贝会导致效率低和内存零碎。
如果你需要数组中个别字符串元素的转储,则应该将转储环境的深度设置为1或更大。当一个CString数组被删除时,或当其中的个别元素被删除时,字符串内存被根据需要释放。
有关使用CStringArray的更多信息,参见“VisualC++程序员指南”中的文章“集合”。
#include <afxcoll.h>
CStringArray类成员
构造 | |
---|---|
CStringArray | 构造一个空的CString对象数组 |
绑定 | |
---|---|
GetSize | 获取这个数组中的元素数目 |
GetSize | 获取这个数组中的元素数目 |
SetSize | 设置这个数组中包含的元素数目 |
GetUpperBound | 返回最大的有效索引 |
操作符 | |
---|---|
FreeExtra | 释放当前数组边界之外的未使用的所有内存 |
RemoveAll | 从数组中删除所有元素 |
operator [] | 设置或获取在指定索引处的元素 |
元素访问 | |
---|---|
GetAt | 返回位于给定索引处的值 |
SetAt | 设置给定索引处的元素的值;不得将数组增大 |
ElementAt | 返回对数组中的某一元素指针的临时引用 |
GetData | 对数组中的元素允许的访问。可以是NULL |
扩大数组 | |
---|---|
SetAtGrow | 设置给定索引处的值,如果必要的话可以增长数组 |
Add | 在数组的末尾添加一个元素;可根据需要增长数组 |
Append | 向数组中添加另一个数组;如果必要的话可增长数组 |
Copy | 将另一个数组拷贝到此数组中;如果必要的话可增长数组 |
插入/删除 | |
---|---|
InsertAt | 在指定索引处插入一个元素(或者是另一个数组中的所有元素) |
RemoveAt | 删除指定索引处的一个元素 |
实例
从"a|b|c|d|e"的字符串中提取出字符,并且存在一个数组中:
///例1
CStringArray road;
CString temp="a|b|c|d|e";
int s0=temp.ReverseFind('|');//反向查找|符号
road.Add(temp.Mid(s0+1));
while(s0>0)
{
temp=temp.Mid(0,s0);
s0=temp.ReverseFind('|');
road.Add(temp.Mid(s0+1));
}
int n=road.GetSize();
for(int i=0;i<n;i++)
{
MessageBox(road.GetAt(i));
}
CStringArray as;
as.Add("aaaa");//加数据
as.Add("bbb");
as.InsertAt(2,"00");//插数据
as.RemoveAt(2);//删数据
as.RemoveAll();//从数组中删除所有元素
//例2
CStringArray ArrayA;
ArrayA.SetSize(3);
ArrayA.SetAt(0, CString("Zebra"));
ArrayA.SetAt(1, CString("Bat"));
ArrayA.SetAt(2, CString("Apple"));
int nCount = ArrayA.GetSize();
//例3
int size=as.GetSize(); //得长度
CStdioFile file;
CString strTemp;
file.Open("Save.txt",CFile::modeCreate|CFile::modeWrite);
for(int i=0;i <size,i++)
{
strTemp=as.GetAt(i); //取数据
file.WriteString(strTemp+"\n");
}
file.Close();
char*
char*是一个指向字符的指针,是一个内置类型。可以指向一个字符,也可以表示字符数组的首地址(首字符的地址)。我们更多的时候是用的它的第二的功能,来表示一个字符串,功能与字符串数组char ch[n]一样,表示字符串时,最后有一个 '\0’结束符作为字符串的结束标志。
#include <iostream>
using namespace std;
void testCharArray()
{
char ch1[12] = "Hello Wrold"; //这里只能ch1[12],ch1[11]编译不通过,提示array bounds overflow
char *pch1 , *pch2 = "string";
char *pch3, *pch4;
pch3 = &ch1[2]; //ch1[2]的地址赋给pch3
char ch = 'c';
pch4 = &ch;
pch1= ch1;
cout << ch1 << endl; //输出ch1[0]到\0之前的所有字符:Hello Wrold
cout << pch1 << endl; //输出ch1[0]到\0之前的所有字符:Hello Wrold
cout << pch2 << endl; //输出ch1[0]到\0之前的所有字符:string
cout << pch3 << endl; //输出ch1[2]到\0之前的所有字符:llo Wrold
cout << *pch3 << endl; //解引用pch3输出pch3指向的字符:l
cout << *pch4 << endl; //解引用pch4输出pch4指向的字符:C
}
string
string是C++标准库(STL)中的类型,它是定义的一个类,定义在头文件中。里面包含了对字符串的各种常用操作,它较char*的优势是内容可以动态拓展,以及对字符串操作的方便快捷,用+号进行字符串的连接是最常用的操作。
#include <string>
void testString()
{
string s1 = "this";
string s2 = string(" is");
string s3, s4;
s3 = string(" a").append("string.");
s4 = s1 + s2 + s3;
cout << s1 << endl;//输出:this
cout << s2 << endl;//输出:is
cout << s3 << endl;//输出:astring.
cout << s4 << endl;//输出:this is astring.
cout << s4.size() << endl;//输出:16
s4.insert(s4.end()-7, 1, ' ');
cout << s4 << endl;//输出:this is a string.
}
CString
CString常用于MFC编程中,是属于MFC的类,如从对话框中利用GetWindowText得到的字符串就是CString类型,CString定义在<afx.h>头文件中。CString(typedef CStringT> CString)为Visual C++中最常用的字符串类,继承自CSimpleStringT类,主要应用在MFC和ATL编程中,所以使用CString时要包含afx.h文件#include <afx.h>。
#include <afx.h>
//因为CString不是标准C++库定义的类型,没有对<<运算符进行重载,
//所以不能通过cout<<cstr来输出内容,只能自己先定义一个方法。
void printCString(const CString &cstr);
void testCString()
{
char *ch = "Hello";
string s = "Wrold";
CString cstr1(ch), cstr2(s.c_str()), cstr3("Program");
printCString(cstr1);//输出:Hello
printCString(cstr2);//输出:Wrold
printCString(cstr3);//输出:Program
CString cstr4, cstr5;
cstr4 = cstr1 + cstr2 + cstr3;
cstr5 = cstr1 + " " + cstr2 + " " + cstr3;
printCString(cstr4);//输出:HelloWroldProgram
printCString(cstr5);//输出:Hello Wrold Program
}
void printCString(const CString &cstr)
{
int n = cstr.GetLength();
for(int i=0; i<n; i++)
{
printf("%c", cstr[i]);
}
printf("\n");
}
char[] 转换成cstring
方法1:
char a[] = “This is a test”;
CString str = a;
方法2:
CString str(a);
方法3:
CString str;
str.Format(_T("%s"), a);
LPSTR、LPCSTR、LPTSTR和LPCTSTR的意义及区别
LPCSTR | 32-bit 指针,指向一个常量字串 | 指向一个常量字符串的32位指针,每个字符占1个字节。 |
LPSTR | 32-bit 指针,指向一个字串 | 指向一个字符串的32位指针,每个字符占1个字节。 |
LPCTSTR | 32-bit 指针,指向一个常量字串。此字串可移植到Unicode和DBCS | 指向一个常量字符串的32位指针,每个字符可能占1个字节或2个字节。 |
LPTSTR | 32-bit 指针,指向一个字串。此字串可移植到Unicode和DBCS | 指向一个字符串的32位指针,每个字符可能占1个字节或2个字节。 |
1、ANSI(即MBCS):为多字节字符集,它是不定长表示世界文字的编码方式。ANSI表示英文字母时就和ASCII一样,但表示其他文字时就需要用多字节。
2、Unicode:用两个字节表示一个字符的编码方式。比如字符’A’在ASCII下面用一个字节表示,而在Unicode下面用两个字节表示,其中高字节用“0”填充;函数’程’在ASCII下面用两个字节表示,而在Unicode下面也是用两个字节表示。Unicode的用处就是定长表示世界文字,据统计,用两个字节可以编码现存的所有文字而没有二义。
3、Windows下的程序设计可以支持ANSI和Unicode两种编码方法的字符串,具体使用哪种就要看定义了MBCS宏还是Unicode宏。MBCS宏对应的字符串指针为LPSTR(即char*),Unicode对应指针为LPWSTR(即unsigned char*)。为了写程序的方便,微软定义了类型LPTSTR,在MBCS下它表示char*,在Unicode下它表示unsigned char*,这就可以重定义一个宏进行不同字符集的转了。
4、Windows使用两种字符集ANSI和Unicode,前者在处理英文字符时使用单字节方式,在处理中文字符时使用双字节方式。后者不管是英文字符还是中文字符都是采用双字节方式表示。Windows NT的所有与字符有关的函数都提供了两种方式的版本,而Windows 9x只支持ANSI方式。_T一般同字符常量相关,如_T(“你好!”);。如果编码方式为ANSI,_T不起任何作用;如果编码方式为Unicode,编译器会把"你好!"以Unicode方式进行保存。_T和_L的区别在于,_L不管你是以什么方式编译,一律以Unicode方法保存。
5、L表示字符串资源采用Unicode编码方式,示例如下:
wchar_t Str[]=L"Hello World!"; //每个字符都用2个字节来存储
6、_T是一个适配宏。当定义了_UNICODE时,_T和L相同;否则,_T的字符串采用ANSI编码方式。示例如下:
LPTSTR lptStr=new TCHAR[32];
TCHAR* szBuf=_T("Hello");
以上两个语句,无论是在ANSI编码方式,还是在Unicode编码方式下都是正确的。
7、微软推荐使用相匹配的字符串函数。例如,在处理LPTSTR或LPCTSTR的时候,应该使用_tcslen来替代strlen函数。否则,在Unicode编码方式下,strlen不能处理wchar_t*的字符串。
8、T是一个非常重要的符号(TCHAR、LPTSTR、LPCTSTR、_T()和_TEXT()等),它表示使用一个中间类型,既不明确表示使用MBCS,也不明确表示使用Unicode。到底使用哪种字符集,在编译的时候才决定。
9、CString类型到LPTSTR类型的转换
CString path1;
LPTSTR path2=path1.GetBuffer(path1.GetLenght());
CString与LPCWSTR、LPSTR、char*、LPWSTR等类型的转换
一.CString与LPCWSTR
两者的不同:LPCWSTR 是Unicode字符串指针,初始化时串有多大,申请空间就有多大,以后存贮若超过则出现无法预料的结果,这是它与CString的不同之处。而CString是一个串类,内存空间类会自动管理。
1.CString转换成LPCWSTR
CString strFileName;
LPCWSTR lpcwStr = strFileName.AllocSysString();
CString str=_T("TestStr");
USES_CONVERSION;
LPCWSTR lpcwStr = A2CW((LPCSTR)str);
MFC中CString和LPSTR是可以通用,其中A2CW表示(LPCSTR) -> (LPCWSTR),USER_CONVERSION表示用来定义一些中间变量,在使用ATL的转换宏之前必须定义该语句。
2. LPCWSTR转换成CString
LPCWSTR lpcwStr = L"TestWStr";
CString str(lpcwStr);
CString str;
LPWSTR lpstr = (LPWSTR)(LPCWSTR)str;
二.CString与LPSTR转换
1.CString转换成LPSTR:
CString strFileName;
LPSTR lpStr = strFileName.GetBuffer();
strFileName.ReleaseBuffer();
CString strFileName;
LPSTR lpStr = (LPSTR)(LPCSTR)strFimeName;
2.LPSTR转换成CString:
LPSTR lpStr = L"TestStr";
CString str(lpStr);
注意:CString和LPCSTR可直接转换,如下:
CString str;
LPCSTR lpcStr = (LPCSTR)str;
三.CString和char*转换
1.CString转换成char*
CString str;
char* p = str.GetBuffer();
CString str;
char* p = (LPSTR)(LPCSTR)str;
2.char*转换成CString
char* p = "test";
CString str = ("%s",p);
四.String和int、float的转换
可以使用atoi,atof,atol等函数来完成。
实例
char name[10];
TCHAR sex[5] ;
char *p = name;
TCHAR *pw = sex;
LPSTR lpstr = name;
LPCSTR lpcstr = name;
lpcstr = lpstr;
lpstr = p;
p = (char*)sex;
pw = (WCHAR*)name;
LPWSTR lpwstr = (LPWSTR)lpstr;
lpwstr = (LPWSTR)lpcstr;
LPCWSTR lpcwstr = (LPCWSTR)lpstr;
lpcwstr = (LPCWSTR)name;
CString str(lpstr);
CString str1(lpcstr);
CString str2(lpwstr);
CString str3(lpcwstr);
CString str4(name);
CString str5(sex);
lpwstr = (LPWSTR)(LPCWSTR)str;
lpstr = (LPSTR)(LPCWSTR)str;
lpcstr = (LPCSTR)(LPCWSTR)str;
p = (char*)str.GetBuffer();
pw = str.GetBuffer();
CString、BST、_bstr_t、char*、long、unsigned long
一.CString转BSTR
1.CString和BSTR的转换
AllocSysString():将 CString 转化成 BSTR:
…
使用完成以后:
SysFreeString(bstr);// 用完释放
BSTR bstr;
CString strSql;
bstr = strSql.AllocSysString();
…
SysFreeString(bstrText); // 用完释放
注意:用完之后必须使用SysFreeString 释放!!!
2.BSTR转CString
BSTR bstr = ::SysAllocString(L"Test");
CString strSql; strSql.Empty(); strSql = (LPCSTR)bstr;
BSTR bstr = ::SysAllocString(L"Test");
CString str(bstr);
二.CString和_bstr_t的转换
1.CString转_bstr_t
_bstr_t bstr;
CString strSql; bstr = (_bstr_t)strSql;
2._bstr_t转CString
_bstr_t bstr;
CString strSql; strSql = (LPCSTR)bstr;
三.BSTR和char*的转换
1.BSTR转换成char*
使用ConvertBSTRToString
BSTR bstrText = ::SysAllocString(L"Test");
char* lpszText2 = _com_util::ConvertBSTRToString(bstrText);
SysFreeString(bstrText); // 用完释放
delete[] lpszText2;
使用_bstr_t的赋值运算符重载
_bstr_t b = bstrText;
char* lpszText2 = b;
2.char*转换成BSTR
使用SysAllocString等API函数
BSTR bstrText = ::SysAllocString(L"Test");
BSTR bstrText = ::SysAllocStringLen(L"Test",4);
BSTR bstrText = ::SysAllocStringByteLen("Test",4);
使用COleVariant或_variant_t
//COleVariant strVar("This is a test");
_variant_t strVar("This is a test");
BSTR bstrText = strVar.bstrVal;
使用_bstr_t,这是一种最简单的方法
BSTR bstrText = _bstr_t("This is a test");
使用CComBSTR
BSTR bstrText = CComBSTR("This is a test");
CComBSTR bstr("This is a test");
BSTR bstrText = bstr.m_str;
使用ConvertStringToBSTR
char* lpszText = "Test";
BSTR bstrText = _com_util::ConvertStringToBSTR(lpszText);
四.CString 转化成long
CString passwd = "123456";
long pwd = atol(passwd.GetBuffer(0));
passwd.ReleaseBuffer();
CString 是一个类,long是一种数据类型。先取得CString 对象中的内容,再将它转化即可。
注意:包含头文件<stdlib.h>
五.CString 转换到unsigned long
void CString2Long(CString str,unsigned long lVal)
{
sscanf((LPSTR)(LPCTSTR)str, "%d", &lVal);
}
struct结构体变量
一开始就是从易语言的精易模块学到的鼠标类型,后来发现凡是自定义的类型都是一个struct。
struct结构体变量可以存放鼠标坐标,可以存放角色信息集合,类似数组,最主要的是一个集合,可以返回坐标型。
struct p_xy
{
long x;
long y;
};
p_xy myp_xy()
{
p_xy pt_xy;
pt_xy.x=10;
pt_xy.y=20;
return pt_xy;
}
使用结构体变量
p_xy pt_xy;
CString t_x1,t_y1;
pt_xy=myp_xy();
t_x1.Format(_T("%ld"),pt_xy.x);
t_y1.Format(_T("%ld"),pt_xy.y);
MessageBoxW(t_x1+"|"+t_y1);
struct TableField
{
TableField()
: strFieldName(_T(""))
, nFieldType(0)
, nFieldLength(0)
{
}
CString strFieldName; // 字段名称
int nFieldType; // 字段类型
int nFieldLength; //字段大小
}