• 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中定义的。

    下面是比较:

     参考: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


      

  • 相关阅读:
    高可用-mysql安装,双主模式+keepalived
    源码-mybatis-01-SqlSessionFactory创建
    J.U.C-volatile
    设计模式-模板设计模式(行为)
    设计模式-代理模式
    线程-join();
    Net Core 文件的上传下载
    mysql 开启日志记录执行SQL语句
    C# 方法多个返回值
    C# get set 方法 设置默认值
  • 原文地址:https://www.cnblogs.com/renxs/p/2324886.html
Copyright © 2020-2023  润新知