热门标签 | 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());


推荐阅读
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • Python 异步编程:深入理解 asyncio 库(上)
    本文介绍了 Python 3.4 版本引入的标准库 asyncio,该库为异步 IO 提供了强大的支持。我们将探讨为什么需要 asyncio,以及它如何简化并发编程的复杂性,并详细介绍其核心概念和使用方法。 ... [详细]
  • PyCharm中配置Pylint静态代码分析工具
    本文详细介绍如何在PyCharm中配置和使用Pylint,帮助开发者进行静态代码检查,确保代码符合PEP8规范,提高代码质量。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
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社区 版权所有