C、C++、MFC 中的“字符串”类型介绍


转自http://blog.sina.com.cn/s/blog_4e3197f201009o1l.html


“字符串”类型在不同的标准中的实现是不一样的,在标准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++头文件中没有“.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
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值