Windows编程中一些常用的字符(串)类型转换

1.C-串
    在C++中有两种字符串,一种是从C沿袭过来的,称为C-字符串,简称C串。C串是以一个全0位(整数0)字节作为结束符的字符序列。因此C-串又被称为ASCIIZ串(即ASCII字符序列加上尾巴Zero)。
    C-串的类型为char*型,说得更精确一点,是const char*型。char*称为字符指针,它与字符数组虽然类型不同,但操作上是一样的,都表示C-串的起始地址。例如:
    char* str="Hello!";
   cout<<*str<<endl;        //显示H
    cout<<str<<endl;         //显示Hello!
    str是字符指针变量。*str是字符指针变量的间接引用。即,若str指向"Hello!"的首地址,则*str表示该地址代表的空间上的值----'H'。输出字符指针就是输出C-串,所以输出str时,便从'H'字符的地址开始,输出所有字符直到遇到0.
    C库函数设计了一系列的C-串库函数,解决C-串的赋值、复制、修改、比较、连接等问题。例如:

 
2.string
    string是一种自定义的类型,它可以方便地执行C-串所不能直接执行的一切操作。它处理空间占用问题是自动分配,需要多少用多少,不像字符指针那样,提心吊胆于指针脱钩时的空间游离。它可以从C-串转换得到,通过string的成员函数(string::c_str())还可以从内部提炼出C-串。
 
 
小心内存泄露
 
由字符数组构造string也是可以的:

 
3.CString
    CString是微软的visual c++提供的MFC里面的一个类,所以只有支持MFC的工程才可以使用。你如果想在Linux的工程上使用那是不现实的,只能用标准C++的string类。另外,国为string类是在C++标准库中的,所以它被封装在了std命名空间中,使用之前需要声明using namespace std;而CString类并不在std命名空间中,因为它不是C++的标准库,只是微软的一个封装库。CString类和string类提供的方法接口并不完全相同,所以不要糊里糊涂地认为某个类中怎么没有另一个类中的方法。此外,他们和char*之间的转换方法也不一样。下面研究怎么从CString中提取出char*的字符串。
 
 看下面一个例子
    CString cs1("Baidu");
    int len=cs1.GetLength();
    char *p=(char*)cs1.GetBuffer(len);
    char *q=(char*)malloc((len+1)*sizeof(char));
    ::strncpy(q,p,len);
    ::AfxMessageBox(CString(string(q).c_str()));
    
    cs1.ReleaseBuffer();
运行后输出的结果为:

咦,这是为什么?
思:调试发现p所指向的字符缓冲,每个字符占用两个字节的空间,但是实际只使用了一个字节的空间,另一个字节为0。用更专业一点的话说就是CString对象中包含的字符采用的unicode编码,用两个字节来编码一个字符,你要将它转换为ANSCII编码的话单纯的通过char*来强制转换貌似是做不到的,这里得利用另一个牛逼一点的函数WideCharToMultiByte将宽字符编码转为多字节编码。如下所示:
-----------------------------------
CString cs1("Baidu");
    int len=cs1.GetLength();
    WCHAR *p=cs1.GetBuffer(len);
    char *q=(char*)malloc((len+1)*sizeof(char));
    WideCharToMultiByte(CP_ACP,
                    0,
                    p,
                    len,
                    q,
                    len,
                    NULL,NULL);                              //将宽字符转为多字节,这里是转为ANSCII编码的字符
    q[len]='\0';
    ::AfxMessageBox(CString(string(q).c_str()));
    
    cs1.ReleaseBuffer();
 
 
4、其它类型转为字符数组型转化为C-串,string
 
 

 
 

注:如果你想这么做的话得注意字符数组后面得有'\0'(是0不是o),这样才能构成一个完整的字符串,如果不加'\0'会出现乱码的。
 
5.字符串存储字符数组

注:我们知道字符串是以'\0'结尾的,所以即使"LiuJiang.txt"的字符长度为11,但是我们在申请空间以复制该字符串时所申请的空间仍然应该是其字符长度+1。最后一个字节是留给结束符的,赋值的时候也应该将这个结束符一同传递过去,目的字符串此时的字符长度仍然保持原值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值