C、C++、MFC中的“字符串”类型介绍
“字符串”类型在不同的标准中的实现是不⼀样的,在标准C中⽤字符数组(char[])来实现,在标准C++中⽤String来实现,在MFC中⽤CString来实现,下⾯将做简要介绍:
⼀、标准C语中的字符数组(char[])
在标准C中,没有字符串类型,只有字符数组!只能通过字符数组来存放操作多个字符!
1、操作字符数组时注意:
字符数组名是地址常量,它代表⼀个内存地址,不能被更改,更不能被赋值,
char * str ="dog"
char str1[10];
str1="dgdkg";//错误
char str2[10]=str; //错误
char a[10]="dgsgfd" //正确,因这是数组初始化语句,⽽不是赋值语名。
2、字符串处理函数:
字符串处理函数为功能函数,处理结果在字符数组中,⽽在⾮返回值中,返回值只代表执⾏状态。
使⽤字符串处理函数时,必须保证参数中的数组有⾜够的长度
⼆、标准C++中的String
在我们的程序中使⽤string类型,我们必须:
1、包含<string>头⽂件,如:#include <string>c++string类型
注意标准C++头⽂件中没有“.h”,<string.h>是C字符串操作函数的头⽂件。在标准C++库中有<cstring>与<string.h>对应,string前⾯的c表⽰这个是C语⾔的,它实际上只是⼀个命名空间std中include了〈string.h>,这是因为C++要减少名称污染。
2、指定标准命名空间,如果没指定此命名空间时,在VC中不能调试通过
⽅式⼀:using namespace std;
⽅式⼆:std::string str;
说明:
1、为什么Turbo C++ 3.0不可以⽤string?
C++标准是1998年出来的,tc3是1998年以前出来的。
2、为什么MFC中要提供CString类型?
CString诞⽣的时候,C++标准还没出来
三、MFC中的CString
在此重点介绍该类的⼏个经典函数,其它详见MSDN。
1、void CString::Format()
当我们要构造字符串时,千万不要忘了CString::Format(),它既能完成“数值型->字符串”的转换,还能实现在原字符串的“任意位置”插⼊“任意的”新字符串或CString对象。
CString str = "the value is";
str.Format("%s a temple: %s:%d", "This is", str, 123);
//输出为“This is a temple:the value is:123”.
但其存在⼀个Bug,当str是类的数据成员时(以CTest为例),对其⾃⾝进⾏格式化的语句,虽能通过编译,但运⾏时会出现错误:如果是Debug版,直接提⽰错误,点击确定后程序退出;如果是Release版,不是提⽰错误,但结果不对!
CTest.str = "this ";
CTest.str.Format("THIS%s", CTest.str);
//Release版结果为:THISTHIS,⽽⾮确定结果THISthis.
2、CString SpanExcluding( LPCTSTR lpszCharSet ) const;
功能:从起始字符开始,截取⼀段字符串,访字符串的字符均不在lpszCharSet内。通常⽤于“根据lpszCharSet内的特殊字符对字符串分段”。
注意:
1)、当程序编码为ANICODE时,lpszCharSet内的字符可以是任意字符;
  但程序编码为MBCS(即ANSI)时,lpszCharSet内不能使⽤ASCII码中(128—255)的字符,因为这部分字符被⽤来为汉字编码;
可参见《计算机字符编码》⼀⽂中的ANSI编码部分。
2)、在VC中如果⽤⼗六进制来表⽰特殊字符时,则该特殊字符不能出现在⼀个字符串的中间,否则会发⽣如下错误:
error C2022: '291' : too big for character。
如"sdge\x00123s"中⽤“\x00”表⽰ASCII为0的字符,但系统会报错:too big for character;因为编辑器会把"\x"后⾯所有位于字符集“0123456789ABCDEF”中的字符,作为⼀个数值来计算,如果换为8时制“\000”则不会出错。
在VC中,只能⽤“⼋进制”数字来表⽰“位于字符串中间”的特殊字符。
参考:
CString CString::SpanExcluding(LPCTSTR lpszCharSet) const
{
ASSERT(AfxIsValidString(lpszCharSet));
return Left(_tcsspn(m_pchData, lpszCharSet));
}
TCHAR.H Routine_UNICODE & _MBCS Not Defined_MBCS Defined_UNICODE Defined
_tcscspn strcspn_mbscspn wcscspn

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。