日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++_系列自学课程_第_9_课_C语言风格字符串_《C++ Primer 第四版》

發布時間:2025/3/17 c/c++ 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 l

4、字符串中的轉義字符

  在字符串字面值中需要注意轉義字符的組成,這一點需要特別注意。如下所示:

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 4

2、釋放動態分配的內存

  為了定義動態數組需從堆里面分配的內存,這些內存需要在不使用的時候進行釋放,否則申請多了就會將系統的內存耗盡,造成內存泄露。?

  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 第四版》的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。