Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >头文件string的作用_cstring头文件的作用

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

作者头像
全栈程序员站长
发布于 2022-09-30 03:15:29
发布于 2022-09-30 03:15:29
5K00
代码可运行
举报
运行总次数:0
代码可运行

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

1.string与cstring有什么区别

代码语言:javascript
代码运行次数:0
运行
复制

<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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
单细胞转录组之拟时序分析
详见此链接:https://www.jianshu.com/p/34c23dbd9dc1
青青青山
2022/07/09
3.7K0
单细胞转录组之拟时序分析
单细胞5 拟时序分析
拟时序分析是为了探索自己感兴趣的几种细胞之间的发育关系,一般不是用全部类型的细胞来做的。实在不行问问ai,回答可详细
用户10300557
2024/06/26
3230
monocle多样本拟时序分析
做拟时序分析是为了探索自己感兴趣的几种细胞之间的发育关系,一般不是用全部类型的细胞来做的。例如本例中选择了CD14和CD16单核细胞。
用户11414625
2024/12/20
2900
monocle多样本拟时序分析
单细胞拟时序/轨迹分析原理及monocle2流程学习和整理
在生命演进的过程中机体会随着时间的变化而产生不同的变化。从婴幼儿长大为成年人再到老年人的过程中,我们的身体机能经历了从"弱-强-弱"的变化过程(宽泛的说),以年为单位来看,有可能我们在10多岁的时候一年内一下子长高了几十厘米,也有可能在年过百半之后的某一年内突然感觉自己一下子精力大不如前;而以天为单位来看,虽然我们无法从肉眼上看出每个个体在短短24小时有什么显著变化,但事实上我们身体中的某些细胞有可能已经在这二十四小时内过完了它短暂的一生。
凑齐六个字吧
2024/09/09
1.3K0
单细胞拟时序/轨迹分析原理及monocle2流程学习和整理
monocle单样本拟时序分析
做拟时序分析是为了探索自己感兴趣的几种细胞之间的发育关系,一般不是用全部类型的细胞来做的。例如本例中选择了CD14和CD16单核细胞。
用户11414625
2024/12/20
1870
monocle单样本拟时序分析
为什么做拟时序(拟时序一本通01)
参考我五年前介绍过的 CNS图表复现08—肿瘤单细胞数据第一次分群通用规则,这3大单细胞亚群构成了肿瘤免疫微环境的复杂。绝大部分文章都是抓住免疫细胞亚群进行细分,包括淋巴系(T,B,NK细胞)和髓系(单核,树突,巨噬,粒细胞)的两大类作为第二次细分亚群。但是也有不少文章是抓住stromal 里面的 fibro 和endo进行细分,并且编造生物学故事的。而且我们已经积累了心肝脾肺肾等多个器官的上皮细胞的细分亚群, 以及免疫细胞里面的髓系和B细胞细分亚群:
生信技能树
2024/03/25
5710
为什么做拟时序(拟时序一本通01)
monocle单样本拟时序分析
做拟时序分析是为了探索自己感兴趣的几种细胞之间的发育关系,一般不是用全部类型的细胞来做的。例如本例中选择了CD14和CD16单核细胞。
生信技能树
2024/07/05
2950
monocle单样本拟时序分析
monocle多样本拟时序分析
前面已经是介绍了单个样品的单细胞转录组表达量矩阵的monocle分析,接下来分享一下多样品的时候如何注意个体差异因素。
生信技能树
2024/07/05
3220
monocle多样本拟时序分析
day 8 拟时序分析
做拟时序分析通常不是拿全部的细胞,而是拿感兴趣的一部分。用subset提取子集即可。因为要使用差异基因来排序,所以要两类及以上细胞。例如下面选择NK和CD8 T细胞;如果只做一类细,就需要二次分群(后面介绍)
昆兰
2024/07/01
2120
拟时序分析就是差异分析的细节剖析
很多小伙伴在后台表示对单细胞数据分析里面的拟时序分析不理解,恰好最近看到了一个超级清晰明了的展现拟时序分析的作用的文献,分享给大家。它完美的展现了差异分析为什么不够,为什么拟时序分析就是差异分析的细节剖析。
生信技能树
2021/12/27
3K0
拟时序分析就是差异分析的细节剖析
monocle2拟时序实战细节剖析(拟时序一本通04)
这个纯粹就是生物信息学领域的“马太效应”,大家都用monocle2做拟时序,所以后来者就简单的追随即可,而且绝大部分人其实并不关心算法细节,仅仅是为了做拟时序而做,那么就无所谓选择哪个软件了。我们也简单的展示了目前的可以做拟时序分析的软件的测评,详见:拟时序的多种算法大比拼(拟时序一本通03) 。但是,测评归测评,最终大家还是得使用monocle2做拟时序分析,所以不得不把重点放它的细节剖析上面,我们后面也会介绍一下其它软件和方法:
生信技能树
2024/03/26
1.9K0
monocle2拟时序实战细节剖析(拟时序一本通04)
单细胞拟时序/轨迹分析monocle3流程学习和整理
拟时序/轨迹分析的基础知识和Monocle2流程可见推文: https://mp.weixin.qq.com/s/aVUpRIkDi83B8_Y_BSBkVA
凑齐六个字吧
2024/09/11
5580
单细胞拟时序/轨迹分析monocle3流程学习和整理
单细胞转录组 | 拟时序分析
拟时序分析(Pseudotime analysis)是一种在单细胞RNA测序(scRNA-seq)数据中重建细胞发育轨迹的计算方法。它基于一个关键假设:在样本中捕获的细胞代表了不同发育阶段的快照,通过计算这些细胞之间的相似性,可以推断出细胞状态变化的顺序,构建出一条或多条发育轨迹。
天意生信云
2025/03/13
3960
单细胞转录组 | 拟时序分析
拟时序分析的热图提取基因问题
我这里不能拿学员真实项目数据来演示,所以还是用我们的老朋友,拿scRNAseq包的表达矩阵测试,见:使用monocle做拟时序分析(单细胞谱系发育)
生信技能树jimmy
2020/03/30
2.9K0
跟着NC学pseudotime| monocle2 拟时序分析 + 树形图
拟时(pseudotime)分析,又称细胞轨迹(cell trajectory)分析,根据不同细胞亚群基因表达量随时间的变化情况通过拟时分析可以来推断发育过程细胞的分化轨迹或细胞亚型的演化过程。并非一定要不同时间段做实验的结果,因为细胞本身存在拟时序变化,细胞是有变化的,可以做拟时序分析。
生信补给站
2022/01/07
18.2K0
跟着NC学pseudotime| monocle2 拟时序分析 + 树形图
马上都2023了,但是CNS级别单细胞文章仍然是使用monocle2
其实大家简单的搜索就能发现 trapnell 实验室虽然出了 monocle3 ,而且写的很清楚:Monocle 2 and Monocle 3 alpha are deprecated, Please use our new package, Monocle 3 ,如下所示的链接 :
生信技能树
2022/12/16
3.4K0
马上都2023了,但是CNS级别单细胞文章仍然是使用monocle2
单细胞转录组基础分析六:伪时间分析
单细胞测序技术是近年最大的生命科学突破之一,相关文章频繁发表于各大顶级期刊,然而单细胞数据的分析依然是大家普遍面临的障碍。本专题将针对10X Genomics单细胞转录组数据演示各种主流分析,包括基于Seurat的基础分析、以及基于clusterProfiler、Monocle、SingleR等R包的延伸分析。不足之处请大家批评指正,欢迎添加Kinesin微信交流探讨!
生信技能树jimmy
2020/09/04
14.7K0
单细胞转录组基础分析六:伪时间分析
SARS-CoV-2感染的雪貂支气管肺泡灌洗液单细胞转录组数据挖掘(4)巨噬细胞内部细分亚群的拟时序和RNA速率分析
给学徒们收集整理了几套带GitHub源代码的文献图表合辑,让优秀者一点一滴拆解开来分享给大家。(全部的代码复制粘贴即可运行,欢迎尝试以及批评指正)
生信技能树
2022/03/03
6520
SARS-CoV-2感染的雪貂支气管肺泡灌洗液单细胞转录组数据挖掘(4)巨噬细胞内部细分亚群的拟时序和RNA速率分析
使用monocle做拟时序分析(单细胞谱系发育)
因为是第一个课程,所以并没有提到单细胞转录组的部分新颖分析要点,比如构建细胞谱系发育,虽然我其实在课程里面也稍微提到过一点,不过怕大家印象不深刻,所以还是有必要单独拿出来讲解一下。
生信技能树jimmy
2020/03/30
8K0
单细胞转录组3大R包之monocle2
主要是针对单细胞转录组测序数据开发的,用来找不同细胞类型或者不同细胞状态的差异表达基因。分析起始是表达矩阵,作者推荐用比较老旧的Tophat+Cufflinks流程,或者RSEM, eXpress,Sailfish,等等。需要的是基于转录本的表达矩阵,我一般用subjunc+featureCounts 来获取表达矩阵。 2014年版本 由Cole Trapnell 于2014年在Nature Biotechnology 杂志发表,是一个略微复杂的R包,并给出了一个测试数据 ,下载地址是: Source co
生信技能树
2018/03/09
21.1K2
单细胞转录组3大R包之monocle2
推荐阅读
相关推荐
单细胞转录组之拟时序分析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验