1. 程式人生 > >c/c++ 字元陣列、字元指標和字串型別

c/c++ 字元陣列、字元指標和字串型別

一、字元陣列

定義:用來存放字元資料的陣列是字元陣列,字元陣列中的一個元素存放一個字元。字元陣列具有陣列的共同屬性。

初始化方式:

1 charc[10]={'0','1','2','3','4','5','6','7','8','9'};

注:當初值個數小於規定長度時,其餘元素自動填充為 '\0'

2 charc[]={'0','1','2','3','4','5','6','7','8','9'};

系統自動計算長度為10

3 char c[]="0123456789"; 或 char c[]={"0123456789"};

此時長度為11,因為建立字串的時候最後面自動添加了'\0','\0'的ASC2碼為0

字串輸出:

謹記一條,以'\0'為結束符,如以下程式是不安全的

char c[3]={'0','1','2'};  
cout<<c<<endl;  

輸出結果除abc外還有一系列不可預知的項

cout<<sizeof(c);//輸出為陣列固定值  
char str[]="0123456789"; cout<<sizeof(str)<<endl;//輸出11  
<span style="font-family: Arial, Helvetica, sans-serif;">cout<<strlen(str)<<endl;//輸出10  </span>

輸入時,所輸字串長度應短語陣列長度,否則後果嚴重。

庫函式:put(str),gets(str),strcat(str1,str2),strcpy(str1,str2),strcmp(str1,str2),strlen(str),strlwr(str),strupr(str)

綜上,字串陣列的使用比較靈活,但安全性上實在是寒磣,只使用特別清晰、簡單的小程式。

二、字元指標

初始化:

char *str="hello world!"; 

說到底,str是一個字元指標,這句僅僅是將“hello world!”的第一個字元的地址賦予str

cout<<*(str+4)<<endl;//這句輸出的是 o
cout<<*str<<endl;//這句輸出   h  
<pre name="code" class="cpp">cout<<str<<endl;//這句輸出hello world!  

str輸出是字串,不是地址,這與cout這個標準輸出物件有關係的,在遇到字元型指標時會將其當作字串名來處理,輸出指標所指的字串,直到遇到0x00。而str的值就是地址。資料型別是字元的(*str)則只輸出單個字元。

如果用cout輸出地址,則需要對字元型指標進行強制型別轉換,我們得用static_cast來實現,把字元型指標轉換成無型別指標

cout << "字串起始地址值: "<< static_cast<const void *>(str) << endl;

如果使用C風格則更為方便

// 輸出字串
printf("字串:%s\n", str);
// 輸出地址值
printf("字串起始地址值:%p\n", str);

char* c和charc[]的區別在於前者是變數,後者是常量。

三、c++提供的標準庫string

string本質是一個類,因此可以進行運算子的過載,還可以自定義方法,帶來極大的靈活性,同時符合高內聚低耦合的程式設計原則。

使用前的準備工作:

[cpp]

1.  #include<string>  

2.  using std::string;  

初始化方法:

[cpp]

1.  string s2(s1);//初始化為s1的一個副本  

2.  string s("value");//常量初始化  

3.  string s(n,'c');//n個字元'c'  


在使用的時候,只需把string當成一個基本型別就可以了,這樣做有兩個極大的好處:

1 再也不用管什麼字串長度啊、越界之類的問題。

2 賦值可以用“=”直接操作,連線可用“+”直接操作,比較可用關係運算符直接操作,提升了可讀性。

3 自定義方法,解耦合。

string的操作:

string str="hello";  
cout<<str.size()<<endl;//長度檢測  
cout<<str.empty()<<endl;//檢測是否為空<span style="background-color: rgb(245, 250, 226); font-family: Arial, Helvetica, sans-serif;">  </span>

輸出:

5

0

需要指出的一點是:

str.size()返回值的型別是string::size_type,儲存str.size()結果的變數必須為string::size_type型別,雖然不清楚它具體是個神馬型別(連c++ primer上都這麼說),但可以肯定是不同於int型別的,因為它是unsigned型別的,這樣它能表示的長度是signed型別的兩倍,此外肯定還有別的優越性。

下標操作的時候,str用法與陣列名類似。