C++ 标准头文件与C头文件区别与联系以及C风格字符串

1、cstdlib是C++里面的一个常用头文件, 等价于C中的<stdlib.h>。

2、一般一个带“.h” 扩展名的库文件,比如iostream.h。这是延续C语言的,为了兼容C。在新标准的库中都有一个

不带".h"扩展名的相对应,区别除了后者好多改进之处,还有一点就是后者的东西都放进了“std”名字空间中。

但是 string.h有点特别,问题在于C++要兼容C的标准库,C的标准库里也有一个名字叫做"string.h"的头文件,里面

包含常用的C字符串处理函数,比如 strcmp。这个头文件和C++的string类没有任何关系,所以 <string>和<string.h>这两个头文件没有任何关系。

<cstring>是与C标准库里的<string.h>相对应,但是运行<cstring>需要添加std名字空间。

现在理清 string.h  string  cstring 这三个头文件的区别:

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

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

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

Cstring 是MFC中的类(感觉好多人搞错了)

C++标准函数库是在C的基础上扩展的,C++标准在继承C标准的时候,去掉了头文件后面的.h,然后在前面加上了C。比如C标准中的<stddef.h>到了C++标准中变成了cstddef。size_t就是定义在stddef.h中定义的。

下面是比较:

C standard library

C++ Standard Library

Standard Template Library

C++0x

C Standard Library

参考:http://blog.csdn.net/weitian826/article/details/5995275

这里需要说明的是关于C风格字符串

1、字符串字面值

字符串字面值是一串常量字符,字符串字面值常量用双引号括起来的零个或多个字符表示,为了兼容C语言,C++中的所有的字符串字面值都有编译器自动在末尾添加一个空字符。

a.字符串没有变量名字,自身表示自身。

b.字符字面值:‘A’

字符串字面值:"A" 包含字母A和空字符2个

c.字符串字面值的链接

d.字符串直接可以赋值给变量,但是与字符串直接相关的内存空间位于只读部分,因此它是常量字符数组。

char* ptr="hello";

prt[0]=‘a‘;//这是错误的 编译可以通过 但是运行的时候就发生异常

我们在使用的时候 要用

const char* ptr="hello";

prt[0]=‘a‘;//编译的时候就能出现错误

当字符串直接赋值给字符数组的初始化的时候,字符串数组存放与栈中,且不允许引用其它地方的内存。

因此编译器会将字符串直接复制到栈的数组内存中。因此可以进行相应的修改。

char stactArray[]="hello";

statctArray[0]=‘a‘;//编译和运行可以通过

e.C++ 风格字符串

使用C++ 风格字符串的时候,要将它当做是 一个普通的类型,如Int,这样反而会避免将string 作为一个类来理解所带来的问题。

f.C 风格字符串

字符串字面值的类型实质是 const char型的数组,C风格字符串是以空字符null结束的字符数组

const char* cp="some value";//编译器会自动在字符串后面加一个null字符

while(cp!=null)//判断当前指向的字符是不是null

{

++cp;
}

C风格字符串的标准版库函数<string.h>

#include <cstring>

strlen(s)//返回s的长度,不包括字符串结束符NULL

strcmp(s1,s2)//当s1<s2 返回值 <0 当s1=s2 返回值=0 当s1>s2 返回值>0

strcat(s1,s2)//把字符串s2 连接到s1上,并返回s1

strcpy(s1,s2)//将s2复制给s1并返回s1

strncat(s1, s2, n) // 将s2的前n个字符连接到s1后面,并返回s1

strncpy(s1, s2, n) // 将s2的前n个字符复制给s1,并返回s1

if(cp1 < cp2) // 比较地址

const char *cp1 = "A string example";

const char *cp2 = "A different string";

int i=strcmp(cp1, cp2); // i>0

i=strcmp(cp2, cp1); // i<0

i=strcmp(cp1, cp1); // i=0

原文地址:https://www.cnblogs.com/xiaoleiel/p/8295905.html

时间: 2025-01-01 12:34:43

C++ 标准头文件与C头文件区别与联系以及C风格字符串的相关文章

.c和.h文件的区别(头文件与之实现文件的的关系~ )

 .c和.h文件的区别 一个简单的问题:.c和.h文件的区别 学了几个月的C语言,反而觉得越来越不懂了.同样是子程序,可以定义在.c文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢? 2楼: 子程序不要定义在.h中. 函数定义要放在.c中,而.h只做声明.否则多引用几次,就会发生函数重复定义的错误. 3楼: .h只做声明,编译后不产生代码   4楼: 这样做目的是为了实现软件的模块化 使软件结构清晰,而且也便于别人使用你写的程序 纯粹用 C 语言语法的角度,你当然可以在 .h

头文件 string.h cstring string 区别

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++版本的头文

fatal error C1010: 在查找预编译头时遇到意外的文件结尾

错误描述:fatal error C1010: 在查找预编译头时遇到意外的文件结尾.是否忘记了向源中添加"#include "stdafx.h""? 错误分析: 此错误发生的原因是编译器在寻找预编译指示头文件(默认#include "stdafx.h")时,文件未预期结束.没有找到预编译指示信息的头文件"stdafx.h". (因为工程中的每个cpp文件属性默认都是使用预编译头(/YU)的,但是添加的第三方文件并没有 #inc

fatal error C1010: 在查找预编译头时遇到意外的文件结尾 (转)

错误描述:fatal error C1010: 在查找预编译头时遇到意外的文件结尾.是否忘记了向源中添加“#include "stdafx.h"”? 错误分析: 此错误发生的原因是编译器在寻找预编译指示头文件(默认#include "stdafx.h")时,文件未预期结束.没有找到预编译指示信息的头文件"stdafx.h". (因为工程中的每个cpp文件属性默认都是使用预编译头(/YU)的,但是添加的第三方文件并没有 #include "

关于file文件操作的头文件 【LINUX】 (转载)

转自:http://blog.csdn.net/figo77ll/article/details/3156052 Linux下如果要对文件进行读取访问,需要包含至少以下两个头文件: #inlcude <unistd.h> #inlcude <fcntl.h> 其中fcntl.h包含了create和open命令,unistd包含了其他的诸如read, write, close等命令.很奇怪为什么不把fcntl的功能直接放到unistd里面呢.. 如果要对STDIN,STDOUT进行“

.m文件导入C++头文件带来的错误

这几天的工作挖了不少的坑,遇到了各种千奇百怪的错误,现在好好总结一下. 新建一个工程,然后新建HelloCPP.h,HelloCPP.cpp文件,HelloCPP.h文件内容如下: #ifndef __CPPWrong__HelloCPP__ #define __CPPWrong__HelloCPP__ //#include <stdio.h> namespace hello { }; #endif /* defined(__CPPWrong__HelloCPP__) 就一个空的namespa

fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h"”?

fatal error C1010: 在查找预编译头时遇到意外的文件结尾.是否忘记了向源中添加"#include "stdafx.h""? vs开发时经常遇到没加stdafx.h头文件,解决办法就是吧预编译头去掉! fatal error C1010: 在查找预编译头时遇到意外的文件结尾.是否忘记了向源中添加"#include "stdafx.h""?,布布扣,bubuko.com fatal error C1010: 在查找

2016-07-07: 重新编译时vc90.pdb不是创建此预编译头时使用的pdb文件

使用VS2008在一个解决方案中包含多个项目时,当设置多个项目的中间目录为同一个目录时,在增量编译时出现"重新编译时vc90.pdb不是创建此预编译头时使用的pdb文件,请重新创建预编译头问题",从而导致整个解决方案每次都必须重新全部生成. 在msdn上获得如下信息: You may receive a "PRJ0008" or "C2471" or "C1083" or "D8022" or "

C语言 文件操作的头文件

计算机文件是以计算机硬盘为载体存储在计算机上的信息集合,是存储在某种长期储存设备上的一段数据流.在C语言中用一个指针变量指向一个文件,这个指针称为文件指针.通过文件指针就可对它所指的文件进行各种操作,C语言规定该文件指针类型为FILE型.文件的信息有这个FILE型的结构体来进行定义. FILE的结构体的定义如下 typedef struct { short level; // 缓冲区“满”或“空”的程度 unsigned flags; // 文件状态标志 char fd; // 文件描述符 un