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用法與陣列名類似。