热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

char*CStringstring区别

一.介绍string和CString均是字符串模板类,string为标准模板类(STL)定义的字符串类,已经纳入C标准之中

一.介绍

string和CString均是字符串模板类,string为标准模板类(STL)定义的字符串类,已经纳入C++标准之中;

CString(typedef CStringT> CString)为Visual C++中最常用的字符串类,继承自CSimpleStringT类,主要应用在MFC和ATL编程中,主要数据类型有char(应用于ANSI),wchar_t(Unicode),TCHAR(ANSI与unicode均可);

char*为C编程中最常用的字符串指针,一般以’\0’为结束标志;

 

二.赋值以及构造

//这里使用了一个console控制台程序作为实验

编译环境:xp32系统 vs2005英文版

#include

#include

#include //在非MFC程序下使用CString类必须加的头文件

#include

using namespace std;

 

int main(void)

{

         //赋值和构造

         char *ch = "Hello World!";

         CString cstr(ch);     //等价于:CString cstr = "Hello World!"; CString("HelloWorld!");

         string str(ch);       //等价于:string str = "Hello World!";  string str("Hello World!");

         string str(cstr);                           //需设置Use Multi-Byte Character Set属性

         cout<<"char* : "<

         cout<<"string : "<

         cout<<"string : "<              //c_str()函数:将内容以C_string返回

         wcout<<"CString : "<       //wcout输出宽字节

         wcout<<"CString : "<

         wcout<<"CString : "<

 

         system("pause");

         return 0;

}

在这里 ch是一个字符串指针&#xff0c;自然就没有构造函数&#xff0c;字节赋值就是了&#xff0c;CString和string都是一个类&#xff0c;有构造函数&#xff0c;可以使用基本的字符串构造&#xff0c;包括char *;

Ps:在Win32控制台&#xff08;console&#xff09;程序下使用CString有两种方法&#xff0c;第一种&#xff1a;直接添加头文件#include ,第二种&#xff1a;在solution标签页&#xff0c;右键工程名&#xff0c;选择properties,

弹出text property pages界面&#xff0c;如下图&#xff0c;选择General&#xff0c;在Use of MFC的后面选择 use MFC in a Shared DLL.如下图

如果你使用的是VC&#43;&#43;6.0&#xff0c;你可以在菜单栏的 工程->设置中找到此选项。

做完这些后&#xff0c;你还要在程序的前面添加两个头文件&#xff0c;#include #include 。注意&#xff1a;你必须让#include 在#include 的前面&#xff0c;这样你就能在程序中使用CString这个类了。

是时候输出来比较下了&#xff0c;在vs默认情况下&#xff0c;使用的是unicode&#xff0c;它在计算机中无论什么时候都是16位的&#xff0c;char *和string都可以用cout直接的输出&#xff0c;但是直接cout CString会出错&#xff0c;你可以在 text property pages界面Character Set 属性中选择Use Multi-Byte Character Set&#xff08;如果你选择了此选项&#xff0c;你可以使用CString类直接够着string&#xff09;。或者你也可以使用wcout&#xff0c;实例中使用了这个方法。

3.运算符重载

&#xff08;1&#xff09;&#xff1a;operator&#61;

我们还是以实例来说明

#include

#include //在非MFC程序下使用CString类必须加的头文件

#include

using namespace std;

 

int main(void)

{

 

    char *ch &#61; "Hello World!";

    CString cstr &#61; ch;                

    string str &#61; cstr;   //同样要设置Use Multi-Byte Character Set属性     

    cout<<"char* : "<

    cout<<"string : "<

    cout<<"string : "<

    wcout<<"CString : "< //wcout输出宽字节

    wcout<<"CString : "<

    wcout<<"CString : "<

    system("pause");

    return 0;

}

可以看出&#xff0c;最方便的是string &#xff0c;可以用CString和char*直接赋值&#xff1b;

其次是CString&#xff0c;可以用char*赋值&#xff1b;

Char*只是一个指针赋值。

&#xff08;2&#xff09;operator&#43;

我们再来看看重载的&#43;

#include

#include //在非MFC程序下使用CString类必须加的头文件

#include

using namespace std;

 

int main(void)

{

 

    char *ch &#61; "Hello World!";

    CString cstr &#61; ch;

    string str &#61; cstr;

    string str2 &#61; str&#43;ch;    //string &#43; char *

    CString cstr2 &#61; cstr &#43; ch;//CString &#43; char *

    char *ch2 &#61; new char[20];

    ZeroMemory(ch2,20);

    strcat(ch2,ch);

 

    cout<<"char* : "<

    cout<<"char2* : "< 

    cout<<"string : "<

    cout<<"string2 : "<

 

    wcout<<"CString : "< //wcout输出宽字节

    wcout<<"CString2 : "<

    system("pause");

    return 0;

}

首先char*没有&#43;运算&#xff0c;它们之间要连接的话可以用strcat函数。

CString和string都可以和char*进行&#43;运算&#xff0c;但是CString和string之间不能 CString cs &#61; str&#43;cstr和string st &#61; str&#43;cstr都是错误的。

&#xff08;3&#xff09;operator&#43;

#include

#include //在非MFC程序下使用CString类必须加的头文件

#include

using namespace std;

 

int main(void)

{

 

    char *ch &#61; "Hello World!";

    CString cstr &#61; ch;

    string str &#61; cstr;

    string str2 &#61; ch; //string &#43; char *

    str2&#43;&#61;ch;

    str2&#43;&#61;cstr;

    CString cstr2 &#61; cstr &#43; ch;//CString &#43; char *

    cstr2&#43;&#61;ch;

    cout<<"char* : "<

    cout<<"string : "<

    cout<<"string2 : "<

 

    wcout<<"CString : "< //wcout输出宽字节

    wcout<<"CString2 : "<

    system("pause");

    return 0;

}

CString和string都可以和char*进行&#43;&#61;运算

String可以和CString进行&#43;&#61;运算&#xff0c;但是CString&#43;&#61;string就不行

另外string和string之间可以&#43;&#61;运算&#xff0c;CString和CString之间也是可以的。

Char*之间是没有&#43;&#61;运算的&#xff0c;strcat可以实现同样的功能。

&#xff08;4&#xff09;operator []

 

#include

#include //在非MFC程序下使用CString类必须加的头文件

#include

using namespace std;

 

int main(void)

{

 

    char *ch &#61; "Hello World!";

    CString cstr &#61; ch;

    string str &#61; cstr;

 

    cout<<"char* : "<

    cout<<"string : "<

    wcout<<"CString : "<   //wcout输出宽字节

    system("pause");

    return 0;

}

都可以使用[]&#xff1b;但是要注意不要越界。越界会发生很严重的错误。

&#xff08;4&#xff09;比较

#include

#include //在非MFC程序下使用CString类必须加的头文件

#include

using namespace std;

 

int main(void)

{

 

    char *ch &#61; "Hello World!";

    CString cstr &#61; ch;

    string str &#61; cstr;

    char *ch2 &#61; "Hellr World!";

 

    cout<<"Result: "<<(ch&#61;&#61;str)<

    cout<<"Result: "<<(cstr&#61;&#61;ch)<

    cout<<"Result: "<<(cstr&#61;&#61;ch2)<

    system("pause");

    return 0;

}

CString与string之间不可以进行比较&#xff0c;但均可以与char*进行比较&#xff0c;并且比较的是值&#xff0c;而不是地址。比较成功&#xff0c;结果返回1或者是0。

三&#xff0e;转换

string 转 CString

CString.format(”%s”, string.c_str());

char 转 CString

CString.format(”%s”, char*);

char 转 string

string s(char *);

string 转 char *

char *p &#61; string.c_str();

CString 转 string

string s(CString.GetBuffer());


推荐阅读
  • 本文详细介绍了MySQL表分区的概念、类型及其在实际应用中的实施方法,特别是针对Zabbix数据库的优化策略。 ... [详细]
  • C++中类的内外定义及内联函数详解
    本文详细介绍了C++中的类内定义与类外定义,以及内联函数的使用方法和注意事项。通过实例说明了不同定义方式的优缺点,并探讨了编译器对内联函数的处理机制。 ... [详细]
  • 本文详细介绍了中心方形数的概念及其计算方法,并提供了多种编程语言下的实现代码。 ... [详细]
  • 本文提供了详细的指导,帮助开发者了解如何使用PHP插件进行网站内容的翻译,特别是针对WordPress插件和主题的汉化及多语言支持。 ... [详细]
  • 本文介绍了iOS应用开发的主要框架,包括Foundation、UIKit、CoreData及CoreGraphics等,并探讨了开发iOS应用所需的硬件和软件环境,以及推荐的编程语言。 ... [详细]
  • POJ2226 二分图最小覆盖问题
    在一个大小为n×m的网格中,部分单元格为泥泞状态,其余为干净。目标是使用宽度固定为1但长度可变的木板覆盖所有泥泞单元格,且不覆盖任何干净单元格。木板允许重叠。本问题通过构建二分图并求其最小覆盖来解决。 ... [详细]
  • 实践指南:利用Jenkins与JMeter实现自动化测试报告通知
    本文详细介绍了如何结合Jenkins和JMeter工具,通过自定义脚本向用户发送测试报告的通知。这不仅提高了开发团队的工作效率,也确保了信息的及时传递。 ... [详细]
  • 2023年PHP处理请求超时的全面指南
    本文详细介绍了在PHP中处理请求超时的各种方法,包括设置脚本执行时间、处理file_get_contents函数超时以及优化AJAX请求等,适合开发者参考学习。 ... [详细]
  • ANSI最全介绍linux终端字体改变颜色等ANSI转义序列维基百科,自由的百科全书由于国内不能访问wiki而且国内关于ANSI的介绍都是简短的不能达到,不够完整所以转wiki到此 ... [详细]
  • iOS 面试实战:15 道经典面试题及解析
    本文精选了15道iOS面试题,并提供了详细的解答思路。旨在帮助开发者更好地准备面试,避免因准备不足而导致的紧张和焦虑。 ... [详细]
  • 在今天的C++考试中遇到了一个关于数组的问题,虽然代码在VS2015上能够成功编译,但在运行时却没有任何输出。请求各位前辈给予指导。 ... [详细]
  • django项目中使用手机号登录
    本文使用聚合数据的短信接口,需要先获取到申请接口的appkey和模板id项目目录下创建ubtils文件夹,定义返回随机验证码和调取短信接口的函数function.py文件se ... [详细]
  • 本文探讨了BZOJ4029 [HEOI2015] 定价问题,通过使用贪心算法解决该问题。文章提供了详细的题目解析和代码实现,重点在于如何通过计算十进制下的最低有效位(lowbit)来简化问题。 ... [详细]
  • 本文探讨了C语言中关于函数定义与调用的一些基本规则,特别是解释了为何函数定义不可嵌套,而函数调用却可以嵌套,并通过具体示例加以说明。 ... [详细]
  • 正在学习操作系统开发,遇到一个内核在GRUB Legacy(0.97)中无法成功引导的问题。具体表现为输入内核命令后显示错误信息,尝试引导时GRUB挂起。 ... [详细]
author-avatar
最棒小小丫_635
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有