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