当前位置:天才代写 > tutorial > C语言/C++ 教程 > C++中string和string.h的浸染和区别

C++中string和string.h的浸染和区别

2017-11-03 08:00 星期五 所属: C语言/C++ 教程 浏览:467

副标题#e#

#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类半点干系也没有,所以 <string>并非<string.h>的“进级版本”,他们是毫无 干系的两个头文件。

要到达楼主的目标,好比同时:

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

可能

#include < cstring >
#include < string >

个中<cstring>是与C尺度库 的<string.h>相对应,但裹有std名字空间的版本。


#p#副标题#e#

笑谈(来自高 质量++)

C++尺度库很大。很是大。难以置信的大。怎么个大法?这么说 吧:在C++尺度中,关于尺度库的规格说明占了密密麻麻300 多页,这还不包罗 尺度C 库,后者只是"作为参考"(诚恳说,原文就是用的这个词)包 含在C++库中。虽然,并非老是越大越好,但在此刻的环境下,确实越大越好, 因为大的库会包括大量的成果。尺度库中的成果越多,开拓本身的应用措施时能 借助的成果就越多。C++库并非提供了一切(很明明的是,没有提供并发和图形 用户接口的支持),但确实提供了许多。险些任何事你都可以求助于它。在归纳 尺度库中有些什么之前,需要先容一下它是如何组织的。因为尺度库中对象如此 之多,你(或象你一样的其他什么人)所选择的类名或函数名就很有大概和尺度 库中的某个名字沟通。为了制止这种环境所造成的名字斗嘴,实际上尺度库中的 一切都被放在名字空间std 中(拜见条款28)。但这带来了一个新问题。无数现 有的C++代码都依赖于利用了多年的伪尺度库中的成果,譬喻,声明在 <iostream.h>,<complex.h>,<limits.h>等头文件中的功 能。现有软件没有针对利用名字空间而举办设计,假如用std 来包装尺度库导致 现有代码不能用,将是一种可耻行为。(这种釜底抽薪的做法会让现有代码的程 序员说出比"可耻" 更逆耳的话)慑于被激愤的措施员会发生的粉碎 力,尺度委员会抉择为包装了std 的那部门尺度库构件建设新的头文件名。生成 新头文件的要领仅仅是将现有C++头文件名中的。h 去掉,要领自己不重要,正 如最后发生的功效纷歧致也并不重要一样。所以<iostream.h>酿成了 <iostream>,<complex.h>酿成了<complex>,等等。对付C 头文件,回收同样的要领,但在每个名字前还要添加一个c.所以C 的 <string.h>酿成了<cstring>,<stdio.h>酿成了 <cstdio>,等等。最后一点是,旧的C++头文件是官方所阻挡利用的(即 ,明晰列出不再支持),但旧的C 头文件则没有(以保持对C 的兼容性)。实际 上,编译器制造商不会遏制对客户现有软件提供支持,所以可以估量,旧的C++ 头文件在将来几年内照旧会被支持。

所以,实际来说,下面是C++头文件 的近况:

旧的C++头文件名如<iostream.h>将会继承被支持,尽量 它们不在官方尺度中。这些头文件的内容不在名字空间std 中。

新的C++ 头文件如<iostream>包括的根基成果和对应的旧头文件沟通,但头文件的 内容在名字空间std 中。(在尺度化的进程中,库中有些部门的细节被修改了, 所以旧头文件和新头文件中的实体不必然完全对应。)

尺度C 头文件如 <stdio.h>继承被支持。头文件的内容不在std 中。

具有C 库成果 的新C++头文件具有如<cstdio>这样的名字。它们提供的内容和相应的旧C 头文件沟通,只是内容在std 中。

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

<string.h>是旧的C 头 文件,对应的是基于char*的字符串处理惩罚函数;

<cstring>是对应 于旧C 头文件的std 版本;

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

假如能把握这些(我相信你能),其余的也就 容易了。

 

    关键字:

天才代写-代写联系方式