C++_系列自学课程_第_9_课_C语言风格字符串_《C++ Primer 第四版》
前面說了寫關于數組和指針的內容,這次在這里討論一下字符串,討論一下C語言風格的字符串。 在C語言里面我們利用字符數組來對字符串進行處理,
在C++里面我們前面說過一種類類型string可以對字符串進行處理, 這里需要引起注意,因為兩種機制存在一定的區別。
?
一、字符串
1、字符串字面值
利用左、右分號 " 和 " 括起來的字符是一個字符串字面值, 字符串字面值可以自引用,可以通過數組、指針進行引用。如下所示:
"" ? ? ? 空字符串, 占用1個字節, 這個字節用來存儲空字符:'\0'
"volcanol" ? 字符串volcanol. ?
int main() {"volcanol"; //do nothing cout<<sizeof("")<<endl;return 0; }程序的執行結果如下所示:
[root@localhost cpp_src]# g++ test.cpp [root@localhost cpp_src]# ./a.out 1?
2、字符串數組、字符串與指針
在定義字符數組的時候,可以通過字符串字面值在定義的時候進行初始化,如下所示。字符串數組可以通過下標來訪問,同時也可以通過指針來訪問,具體
實例如下所示。
Exp:
int main() {char cStrArray[]="volcanol";for(size_t i=0; i != sizeof("volcanol"); i++)cout<<cStrArray[i]<<endl;char *pCh = "volcanol";for(;*pCh != '\0';pCh++)cout<<*pCh<<endl;cout<<endl;char *pCh1 = "volcanol";for(;*pCh1 != '\0';++pCh1)cout<<*pCh1<<endl;return 0; }程序執行的街結果如下所示:
[root@localhost cpp_src]# g++ test.cpp [root@localhost cpp_src]# ./a.out v o l c a n o lv o l c a n o lv o l c a n o l這里要多說一句,字符串字面值的數據類型為 const char * 類型,我們定義的數組和指針一般都不會定義為const的, 如果確定不能改變數組的內容,則可以將
數組定義為const類型的,這樣就可以避免不修改數組的內容。 利用指針和字符串字面值進行操作的時候,需要注意在指針沒有改變指向的時候,不能通過指針來修改
字符串字面值的值。
int main() {char *pCh ="volcanol";*pCh = 'A';cout<<*pCh<<endl;return 0; }這段代碼編譯不會出錯,但是運行的時候會出現段錯誤, 執行情況如下所示:
[root@localhost cpp_src]# g++ test.cpp [root@localhost cpp_src]# ./a.out 段錯誤就是通常說的segment error。
?
3、利用字符串本身訪問
字符串本身具有一個特殊的特性,字符串字面值本身就具有字符數組名的作用。如下所示:
int main() {for(size_t i = 0; i != sizeof("volcanol"); i++)cout<<("volcanol"[i])<<endl;return 0; }和下面的例子:
int main() {//for(size_t i = 0; i != sizeof("volcanol"); i++)//cout<<("volcanol"[i])<<endl;for(size_t i=0; i!=sizeof("volcanol");i++)cout<<"volcanol"[i]<<endl;return 0; }這個地方的實例要注意字符串字面值的和下標操作符的使用。兩個程序的執行結果都如下所示:
[root@localhost cpp_src]# g++ test.cpp [root@localhost cpp_src]# ./a.out v o l c a n o l4、字符串中的轉義字符
在字符串字面值中需要注意轉義字符的組成,這一點需要特別注意。如下所示:
int main() {cout<<"volcnaol\thi,nice to meet you"<<endl;printf("volcanox\thi,nice to meet you\n");return 0; }程序執行的情況如下:
[root@localhost cpp_src]# vim test.cpp [root@localhost cpp_src]# g++ test.cpp [root@localhost cpp_src]# ./a.out volcnaol hi,nice to meet you volcanox hi,nice to meet you今天發現編譯器的一個特殊情況:當我們同時連續輸出\b\t 的時候,會出現“淹沒”的情形。
int main() {cout<<"volcnaol\b\thi,nice to meet you"<<endl;printf("volcanol\b\thi,nice to meet you\n");return 0; }程序執行的結果如下所示:
[root@localhost cpp_src]# g++ test.cpp [root@localhost cpp_src]# ./a.out volcnaolhi,nice to meet you volcanolhi,nice to meet you可以發現這個地方執行的結果與我們預期不一樣。就是我說的出現了“淹沒”的情形\b 和 \t的效果全淹沒啦。
5、 cstring頭文件支持
C語言中提供了很多標注庫函數支持字符串的操作,通過包含頭文件<string.h>的實現引進庫, 而在C++中通過頭文件<cstring>提供支持,提供的函數有:
strlen ? 字符串長度,不包括最后的空字符null; ?
strcmp(str1,str2) ? ?按照字典序比較str1、str2, 若str1> str2則返回正數, 若str1== str2則返回0, 如果str1<str2則返回負數; 注意這個函數區分
? ? ?字符的大小寫
strcat(str1, str2) ? ? 將字符串str2連接到str1之后, 這個函數需要保證 sizeof(str1) >= strlen(str1) + strlen(str2); 函數返回str1。
strcpy(str1,str2) ? ?將字符串str2復制到str1中,注意要保證 sizeof(str1) >= str2 ; 函數返回str1;
strncat(str1,str2,n) ? 將字符串str2的前n個字符,連接到字符串str1之后,函數返回str1;
? strncpy(str1,str2,n) ?將字符串str2的前n個字符,復制到字符串str中,函數返回str1;
?
cstring提供的支持要注意留足夠的空間來進行操作,否則就會出現異常, 同時要注意字符串最后的null字符的特殊性。
?
二、動態數組
數組在定義的時候需要指定數組的大小,而且指定數組大小必須是一個整型字面值或者cosnt修飾的整型變量或者可以在編譯時計算出結果的整型表達式。
C++提供了另外的一種機制-----動態數組, 在定義的時候可以通過變量來指定數組的大小。
在程序運行的時候系統會為程序維護一塊特殊的內存區域,這塊內存區域在程序運行的時候用于程序來自由的使用,但是需要程序自己來管理,這塊區域
就是堆區域(heap)。
?1、定義動態數組
在C++中通過new操作符來定義動態數組。例如定義一個int型的動態數組,如下所示:
int array_size;cout<<"please input the size of the array you want alloc:";cin>>array_size; int *pInt = new int[array_size];這里我們可以看到我們可以動態的定義數組,可以根據實際需要來分配數組的大小。操作符 new 返回指向數組第一個元素的地址,這里這個地址用來初始化int *
的指針pInt。這樣定義后,就可以利用指針來訪問新分配的數組了,如下所示:
int main() {int array_size;cout<<"please input the size of array you want alloc:";cin>>array_size;int *pInt = new int[array_size];for(size_t i = 0; i != array_size; ++i)*(pInt + i ) = i;for(size_t i = 0; i != array_size; i++)cout<<*(pInt + i)<<endl;return 0; }程序執行的結果如下:
[root@localhost cpp_src]# ./a.out please input the size of array you want alloc:5 0 1 2 3 42、釋放動態分配的內存
為了定義動態數組需從堆里面分配的內存,這些內存需要在不使用的時候進行釋放,否則申請多了就會將系統的內存耗盡,造成內存泄露。?
C++用 delete操作符來釋放動態分配的內存。如下所示:
Exp:
int array_size;cout<<"please input the size of array you want alloc:";cin>>array_size;int *pInt = new int[array_size];delete [] pInt;這里就將申請的內存空間釋放完畢,相當于C語言標準庫中的free()函數.
?
轉載于:https://www.cnblogs.com/volcanol/p/4008333.html
總結
以上是生活随笔為你收集整理的C++_系列自学课程_第_9_课_C语言风格字符串_《C++ Primer 第四版》的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: net core框架介绍
- 下一篇: 经典假设检验理论记录一二