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


推荐阅读
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文探讨了 Objective-C 中的一些重要语法特性,包括 goto 语句、块(block)的使用、访问修饰符以及属性管理等。通过实例代码和详细解释,帮助开发者更好地理解和应用这些特性。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
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社区 版权所有