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


 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM