前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >头文件string的作用_cstring头文件的作用

头文件string的作用_cstring头文件的作用

作者头像
全栈程序员站长
发布2022-09-30 11:15:29
4.8K0
发布2022-09-30 11:15:29
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

1.string与cstring有什么区别

代码语言:javascript
复制

<string>是C++标准库头文件,包含了拟容器class std::string的声明(不过class string事实上只是basic_string<char>的typedef),用于字符串操作。 <cstring>是C标准库头文件<string.h>的C++标准库版本,包含了C风格字符串(NUL即’\0’结尾字符串)相关的一些类型和函数的声明,例如strcmp、strchr、strstr等。<cstring>和<string.h>的最大区别在于,其中声明的名称都是位于std命名空间中的,而不是后者的全局命名空间。 看定义就知道了,string是新标准,定义了namespace std;而cstring虽然也是新标,但是定义中包含的是string.h。 string中可以进行+ = += >等运算,而cstring中不能进行相关运算。

1.

#include <cstring> //不可以定义string s;可以用到strcpy等函数

using namespace std;

#include <string> //可以定义string s;可以用到strcpy等函数 using namesapce std;

#include <string.h> //不可以定义string s;可以用到strcpy等函数

2.

1)文件cstring,和string.h对应,c++版本的头文件,包含比如strcpy之类的字符串处理函数 2)文件string.h,和cstring对应,c版本的头文件,包含比如strcpy之类的字符串处理函数 3)文件string,包含std::string的定义,属于STL范畴 4)CString,MFC里的的字符串类

string.h是C语言中字符串操作函数的头文件 cstring是c++对C语言中的strcpy之类的函数申明,包含cstring之后,就可以在程序中使用C语言风格的strcpy之类的函数。

string是c++语言中string类模板的申明 CString是MFC中定义的字符串类,MFC中很多类及函数都是以CString为参数的,另外CString类重载了(LPCSTR)运算符,所以如果你在MFC下面使用CString类,就可以直接用CString类做为参数来调用需要一个C语言风格字符串的win api函数,编译器会自动调用(LPCSTR)成员函数完成从CString到一个C风格字符串的转换。如果你在MFC下使用C++语言中标准的 string类,那么在调用需要C语言风格的字符串为参数的win api时,你必须显示调用sting.c_str()成员函数,来完成同样的转换,也就是说在使用MFC里,如果用CString类,会比sting类方便那么一点点。

3.

(1).首先说cstring与string.h: cstring和string.h其实里面都是C标准库提供的东西,某些实现中cstring的内容 就是: namespace std { #include <string.h> } cstring是C++的组成部分,它可以说是把C的string.h的升级版,但它不是C的组成部分。 所以如果你用的是C++,那么请用cstring,如果你用的是C请用string.h。

(2).string与cstring: 一般一个C++库老的版本带“.h”扩展名的库文件,比如iostream.h,在新标准后的标准库中都有一个不带“.h”扩展名的相对应,区别除了后者的好多改进之外,还有一点就是后者的东东都塞进了“std”名字空间中。 string,它是C++定义的std::string所使用的文件,是string类的头文件,属于STL范畴。它有很多对字符串操作的方法。

4.string.h是C++标准化(1998年)以前的C++库文件,在标准化过程中,为了兼容以前,标准化组织将所有这些文件都进行了新的定义,加入到了标准库中,加入后的文件名就新增了一个”c”前缀并且去掉了.h的后缀名,所以string.h头文件成了cstring头文件。但是其实现却是相同的或是兼容以前的。相当于标准库组织给它盖了个章,说“你也是我的标准程序库的一份子了”

5.cstring代表的是string.h,但是被封装到了std里面,譬如调用strlen函数,需要写成std::strlen(yourstr)才行,这个使用方法比较符合C++的标准要求string就是C++标准库里面的string模板(确切地说应该是一个特化的模板),但是他同样包含了C风格字符串操作函数的定义(应该是通过包含string.h实现的)string.h就不需要使用名字空间了,这个是C风格字符串操作的一个函数库,strlen,strcpy,strcat,strcmp……都在这里面了,不过既然是C风格的库,当然不需要namespace支持了。

2.C++中string和string.h的作用和区别

#include < string .h >

void main(){string aaa = ” abcsd d ” ;printf( ” looking for abc from abcdecd %s\n ” ,(strcmp(aaa, ” abc ” )) ? ” Found ” : ” Not Found ” );

}

不能正确实行,提示说是string 类型没有定义

而下面:

#include < string >

using namespace std;void main(){string aaa = ” abcsd d ” ;printf( ” looking for abc from abcdecd %s\n ” ,(strcmp(aaa, ” abc ” )) ? ” Found ” : ” Not Found ” );}

这里的string编译器就认识了,可是strcmp就不认识了呢?

一般一个C++的老的带“。h”扩展名的库文件,比如 iostream.h,在新标准后的标准库中都有一个不带“。h”扩展名的 相对应,区别除了后者的许多改进之外,还有一点便是后者的东东都塞进了 “std”名字空间中。

但仅有string分外。

问题在于 C++要兼容C的标准库,而C的标准库里可巧也已经有一个名字叫做 “string.h”的头文件,包含一些常用的C字符串处置函数,比如楼 主说到的strcmp.

这个头文件跟C++的string类半点联络也没有,所以并非的“晋级版别”,他们是毫无 联络的两个头文件。

要抵达楼主的目的,比如一同:

#include < string .h >#include < string >using namespace std;

或许

#include < cstring >#include < string >C++中string和string.h的作用和区别(2)笑谈(来自高 质量++)

C++标准库很大。非常大。难以置信的大。如何个大法?这么说 吧:在C++标准中,关于标准库的标准说明占了密密麻麻300 多页,这还不包含 标准C 库,后者只是”作为参看”(老实说,原文便是用的这个词)包 含在C++库中。当然,并非总是越大越好,但在如今的情况下,确实越大越好, 因为大的库会包含许多的功用。标准库中的功用越多,开发自个的应用程序时能 凭仗的功用就越多。C++库并非供应了悉数(很明显的是,没有供应并发和图形 用户接口的支撑),但确实供应了许多。几乎任何事你都可以求助于它。在归纳 标准库中有些啥之前,需要介绍一下它是怎样组织的。因为标准库中东西如此 之多,你(或象你相同的其他啥人)所选择的类名或函数名就很有可以和标准 库中的某个名字相同。为了避免这种情况所构成的名字冲突,实习上标准库中的 悉数都被放在名字空间std 中(参见条款28)。但这带来了一个新问题。许多现 有的C++代码都依赖于运用了多年的伪标准库中的功用,例如,声明在,,等头文件中的功 能。现有软件没有关于运用名字空间而进行描写,如果用std 来包装标准库致使 现有代码不能用,将是一种廉耻举动。(这种釜底抽薪的做法会让现有代码的程 序员说出比”廉耻” 更尖锐的话)慑于被激怒的程序员会发作的损坏 力,标准委员会决定为包装了std 的那有些标准库构件创立新的头文件名。生成 新头文件的方法只是是将现有C++头文件名中的。h 去掉,方法本身不重要,正 如结尾发作的效果不一致也并不重要相同。所以变成了,变成了,等等。关于C 头文件,选用相同的方法,但在每个名字前还要添加一个c.所以C 的变成了,变成了,等等。结尾一点是,旧的C++头文件是官方所敌对运用的(即 ,明晰列出不再支撑),但旧的C 头文件则没有(以坚持对C 的兼容性)。实习 上,编译器制造商不会间断对客户现有软件供应支撑,所以可以估量,旧的C++ 头文件在将来几年内仍是会被支撑。

所以,实习来说,下面是C++头文件 的现状:

旧的C++头文件名如将会继续被支撑,尽管 它们不在官方标准中。这些头文件的内容不在名字空间std 中。

新的C++ 头文件如包含的根本功用和对应的旧头文件相同,但头文件的 内容在名字空间std 中。(在标准化的过程中,库中有些有些的细节被修改了, 所以旧头文件和新头文件中的实体不一定完全对应。)

标准C 头文件如继续被支撑。头文件的内容不在std 中。

具有C 库功用 的新C++头文件具有如这样的名字。它们供应的内容和相应的旧C 头文件相同,只是内容在std 中。

所有这些初看有点怪,但不难习气它 。最大的应战是把字符串头文件理理解:

是旧的C 头 文件,对应的是依据char*的字符串处置函数;

是对应 于旧C 头文件的std 版别;

是包装了std 的C++头文件, 对应的是新的string 类。

如果能掌握这些(我相信你能),其他的也就 简略了

3. string和CString 的比较  

(一) 概述   string和CString均是字符串模板类,string为标准模板类(STL)定义的字符串类,已经纳入C++标准之中;   CString(typedef CStringT<TCHAR, StrTraitMFC<TCHAR>> CString)为Visual C++中最常用的字符串类,继承自CSimpleStringT类,主要应用在MFC和ATL编程中,主要数据类型有char(应用于ANSI),wchar_t(unicode),TCHAR(ANSI与unicode均可);   char*为C编程中最常用的字符串指针,一般以’\0’为结束标志;   (二) 构造   2 string是方便的,可以从几乎所有的字符串构造而来,包括CString和char*;   2 CString次之,可以从基本的一些字符串变量构造而来,包括char*等;   2 char*没有构造函数,仅可以赋值;   2 举例:   char* psz = “joise”;   CString cstr( psz );   string str( cstr );   (三) 运算符重载   a) operator=   2 string是最方便的,几乎可以直接用所有的字符串赋值,包括CString和char*;   2 CString次之,可以直接用些基本的字符串赋值,包括char*等;   2 char*只能由指针赋值,并且是极危险的操作,建议使用strcpy或者memcpy,而且char*在声明的时候如未赋初值建议先设为NULL,以避免野指针,令你抓狂;   2 举例:   char *psz = NULL;   psz = new char[10]; //当然,以上的直接写成char *psz = new char[10];也是一样   memset( psz, 0, 10 );   strcpy( psz, “joise” );   CString cstr;   cstr = psz;   string str;   str = psz;   str = cstr;   delete []psz;   b) operator+   2 string与CString差不多,可以直接与char*进行加法,但不可以相互使用+运算符,即string str = str + cstr是非法的,须转换成char*;   2 char*没有+运算,只能使用strcat把两个指针连在一起;   2 举例:   char* psz = “joise”;   CString cstr = psz;   cstr = cstr + psz;   string str = psz;   str = str + str + psz;   strcat( psz, psz );   strcat( psz, cstr );//合法   strcat( psz, str );//非法,由此可见,CString可自动转换为const char*,而string不行   c) operator +=   2 string是最强大的,几乎可以与所有的字符串变量+=,包括CString和char*;   2 CString次之,可以与基本的一些字符串变量进行+=而来,包括char*等;   2 char*没有+=运算符,只能使用strcat把两个指针连在一起;   d) operator[]   2 CString最好,当越界时会抛出断言异常;   2 string与char*下标越界结果未定义;   2 举例:   char* psz = “joise”;   CString cstr = psz;   cout << cstr[8];   string str = psz;   cout << str[8];   cout << psz[8];   e) operator== 、operator!=、operator> 、operator< 、operator>= 、perator<=   2 CString与string之间不可以进行比较,但均可以与char*进行比较,并且比较的是值,而不是地址;    cout << ( psz == cstr );    cout << ( psz == str );    cout << ( str == psz );    cout << ( cstr == psz );//以上代码返回均为1   (四) 常用算法   a) 查找   作用   char*   string   CString   查找指定值   strchr   strstr   strrstr   strspn   find   Find   第一个匹配的值     fild_first_of   FindOneOf   从后面开始查找   ReserveFind   指定匹配方式     find_if     注:find_if中是把范围内的值挨个代入匹配函数直至返回true   b) 比较   作用   char*   string   CString   查找指定值(区分大小写)   strcmp   strncmp   strcoll   _strncoll   operator<   operator>   operator<=   operator>=   operator==   operator!=   Collate   Compare   查找指定值(不区分大小写)   _stricmp   _strnicmp   _stricoll   _strnicoll   CollateNoCase   CompareNoCase   注:返回值如果<0则前面的值小于后面的值,反之亦然   c) 替换   作用   char*   string   CString   查找指定值   _strset   _strnset   replace   replace_copy   replace_copy_if   replace_if   Replace   d) 插入   作用   char*   string   CString   查找指定值

 e) 增加   作用   char*   string   CString   动态增加值   strcat   push   append   Append   AppendChar   AppendFormat   f) 截取   作用   char*   string   CString   得到部分值   用下标操作   substr   Left   Mid   Right   Truncate   g) 移除   作用   char*   string   CString   移除部份值   remove   Remove   移除空白值   RemoveBlanks   注:此为ATL提供,非C函数   remove_if   Trim   TrimLeft   TrimRigth   h) 转换大小写   作用   char*   string   CString   转换大小写   _strlwr   _strupr   MakeLower   MakeUpper   i) 与其他类型转换   作用   char*   string   CString   转化为数字   atoi   atod   atof   Format   转化为char*   c_str   GetBuffer   GetBufferSetLength   j) 格式化   作用   char*   string   CString   格式化   sprintf   Format   k) 得到长度   作用   char*   string   CString   得到长度   strlen   length   GetLength   得到大小   size   GetAllocLength   l) 判断为空   作用   char*   string   CString   判断是否为空   判断是否==NULL或者第一个字符是否是’\0’   empty   IsEmpty   m) 重定义大小   作用   char*   string   CString   重定义大小   realloc   new   resize   GetBufferSetLength   n) 释放资源   作用   char*   string   CString   释放   free   delete (delete[])   ReleaseBuffer   ReleaseBufferSetLength   (五) 安全性   CString > string > char*;   (六) 灵活性   CString > string >char*;   (七) 可移植性   char* = string > CString     insert   Insert

方法一: CString m_str(_T(“qwerg”)); char *chr=new char[m_str.GetLength()+1]; WideCharToMultiByte(CP_ACP,0,m_str.GetBuffer(),-1,chr,m_str.GetLength()+1,NULL,NULL); string str=chr; cout<<str; 方法二 CString str = _T(“ooqoqoq”); setlocale(LC_ALL, “chs”); char *p = new char[str.GetLength()+1]; wcstombs(p,str,str.GetLength()+1); string m_fileName = p; cout<<m_fileName;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/194244.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月13日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档