VC++学习-函数篇(变量)

编程环境: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的意义及区别

LPCSTR32-bit 指针,指向一个常量字串指向一个常量字符串的32位指针,每个字符占1个字节。
LPSTR32-bit 指针,指向一个字串指向一个字符串的32位指针,每个字符占1个字节。
LPCTSTR32-bit 指针,指向一个常量字串。此字串可移植到Unicode和DBCS指向一个常量字符串的32位指针,每个字符可能占1个字节或2个字节。
LPTSTR32-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; //字段大小
}

参考:https://blog.csdn.net/jhb92/article/details/1488004

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值