1.string与cstring有什么区别
<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