string和cstring头文件的区别
1.string与cstring有什么区别<string>是C++标准库头文件,包含了拟容器class std::string的声明(不过class string事实上只是basic_string<char>的typedef),用于字符串操作。<cstring>是C标准库头文件<string.h&am
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;
更多推荐
所有评论(0)