C 风格字符串,C++string类,MFC,CString类的区别。

简介: 字符串,顾名思义是由字符组成的字符串,在标准C,标准C++,MFC中 字符串这一功能的实现是不相同的,C++完全兼容了C。 1.  标准C中的字符串    在标准C中没有string这样的数据类型,C中的字符串是有char类型的字符数组或者char类型的字符指针来实现的。

字符串,顾名思义是由字符组成的字符串,在标准C,标准C++,MFC中 字符串这一功能的实现是不相同的,C++完全兼容了C。

1.  标准C中的字符串   

在标准C中没有string这样的数据类型,C中的字符串是有char类型的字符数组或者char类型的字符指针来实现的。例如:

     char   name[26]="This is a C-style string"; 或者

     char  *name="This is a C-style string"; 

   类型的字符串以\0为结束标记,所占内存是实际子符长度+1,其初始化和赋值都要逐个字符的赋值,修改不辨,粒度太小,很不直观,是程序员分散了一些软件的高级层面问题,如算法,抽象数据类型或软件构架。char   *没有构造函数,仅能由指针赋值,而且是一个极其危险的操作,在声明char * 的时候如果没有赋初值,建议先初始化为NULL,以免出现悬浮指针或者指向地址不明的指针,否则,出错会让你很爽!

   标准C中是没有string类型,但是在C中有string.h头文件,需要注意的是此string.h中的string 非彼string,<string.h>头文件中定义了一些我们经常用到的操作字符串的函数,如复制函数strcpy,连接字符串strcat,比较字符串strcmp,这些函数的操作对象都是指向char *的字符串。

2.标准C++中的string类

    C++支持C风格字符串的使用,而且引入了string类的概念,string为标准模板类STL定义的字符串,几乎可以从所有的字符串构造出来。

string字符串类的都文件是<string>,并且要和using namespace std;  一起使用。头文件<string>和头文件<string.h>没有任何关系,前者是标准C++中的模板库类,后者是标准C中的包含常用C字符串处理函数的头文件,如strcmp,前者并非是后者的升级版。

   要深刻理解标准C++中string是一个类, 如在标准C中定义如下:char * pt=NULL;      这无疑是正确的,但是在标准C++中定义  string  *pt=NULL;这样做编译器不会有警告和错误,但是运行是就会有异常。这是因为string作为一个类,定义类的对象时要调用其构造函数的,上面的例子既没有调用其构造函数,还把指针赋值为NULL,很明显就会出错的。正确的 方法是是new操作符,C++中的new不同于C中的malloc, new不但会分配一块内存,还调用类的构造函数。string *pt=new("this is a c++-style string"); 或者不用指针 string  str;系统自动调用默认的构造函数,构造一个string类的对象。

3. MFC中的CString类。

        MFC中的字符串类是CString,封装了string的东西,并增加了一些接口,在功能上完全兼容string类,而一些标准的C/C++不能直接对CString类进行操作,CString 类是微软的visual c++提供的MFC里面的一个类,所以只有支持MFC的工程才可以使用。如在linux上的工程就不能用CString了,只能用标准C++中的 string类了。另外,因为string类是在c++标准库中,所以它被封装在了std命名空间中,使用之前需要声明using namespace std;而CString类并不在std命名空间中,因为它不是c++的标准库,只是微软的一个封装库。这点看来用string类的程序的移植性更好。CString和string提供的接口方法不同,对char*的转换也不同。下面的转换内容来自CSDNBLOG:http://blog.csdn.net/bitxinhai/article/details/2292014

4.1 CString 和string的转换

  stringstr="ksarea";
CStringcstr(str.c_str());//或者CString cstr(str.data());初始化时才行
cstr=str.c_str();或者cstr=str.data();
str=cstr.GetBuffer(0); //CString -> string
cstr.format("%s", str.c_str()); //string->CString
cstr.format("%s", str.data()); //string->CString
str = LPCSTR(cstr); //CString->string
/*c_str()和data()区别是:前者返回带'/0'的字符串,后者则返回不带'/0'的字符串*/

4.2.CString和int的转换inti=123;
CStringstr;
str.format("%d",i);//int->CString 其他的基本类型转化类似
i=atoi(str);//CString->int 还有(atof,atol)4.3.char*和CString的转换CStringcstr="ksarea";
char* ptemp=cstr.getbuffer(0);
char* str;
strcpy(str,ptemp);//CString->char*
cstr.releasebuffer(-1);
char*str="lovesha";
CStringcstr=str;//char*->CString string类型不能直接赋值给CString至于int与float、string与char*之间的转化可以使用强制转化,或者标准库函数进行。对于CString与其他类型的转化方法很多,但其实都殊途同归,朝着一个方向即将类型首先转化为char*类型,因为char*是不同类型之间的桥梁。得到char*类型,转化为其他类型就非常容易了。这篇文章: http://hi.baidu.com/sage_haokun/blog/item/a44b9733aa14d812ebc4afbc.html ,还不错,主要讲述CString和string的区别,感兴趣的可以去瞅一下。

目录
相关文章
|
3天前
|
索引 Python
String(字符串)
String(字符串)。
11 3
|
30天前
|
Java
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
本文深入探讨了Java中方法参数的传递机制,包括值传递和引用传递的区别,以及String类对象的不可变性。通过详细讲解和示例代码,帮助读者理解参数传递的内部原理,并掌握在实际编程中正确处理参数传递的方法。关键词:Java, 方法参数传递, 值传递, 引用传递, String不可变性。
50 1
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
|
22天前
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
|
25天前
|
NoSQL Redis
Redis 字符串(String)
10月更文挑战第16天
35 4
|
26天前
|
安全 Java 测试技术
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
23 2
|
29天前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
19 1
|
1月前
|
数据可视化 Java
让星星月亮告诉你,通过反射创建类的实例对象,并通过Unsafe theUnsafe来修改实例对象的私有的String类型的成员属性的值
本文介绍了如何使用 Unsafe 类通过反射机制修改对象的私有属性值。主要包括: 1. 获取 Unsafe 的 theUnsafe 属性:通过反射获取 Unsafe类的私有静态属性theUnsafe,并放开其访问权限,以便后续操作 2. 利用反射创建 User 类的实例对象:通过反射创建User类的实例对象,并定义预期值 3. 利用反射获取实例对象的name属性并修改:通过反射获取 User类实例对象的私有属性name,使用 Unsafe`的compareAndSwapObject方法直接在内存地址上修改属性值 核心代码展示了详细的步骤和逻辑,确保了对私有属性的修改不受 JVM 访问权限的限制
49 4
|
20天前
|
存储 安全 Java
String、StringBuffer 和 StringBuilder 的区别
【10月更文挑战第21天】String、StringBuffer 和 StringBuilder 都有各自的特点和适用场景。了解它们之间的区别,可以帮助我们在编程中更合理地选择和使用这些类,从而提高程序的性能和质量。还可以结合具体的代码示例和实际应用场景,进一步深入分析它们的性能差异和使用技巧,使对它们的理解更加全面和深入。
13 0
|
1月前
|
C语言 C++
深度剖析C++string(中)
深度剖析C++string(中)
45 0
|
2月前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
38 0
java基础(13)String类

热门文章

最新文章