拿捏住C字符串,這個煩人程度不亞于指針的小東西

      網友投稿 732 2025-04-02

      文章目錄

      字符串處理能力能夠反映出一個程序員的技術功底

      基礎掃盲篇

      字符串字面量

      難度指數:2 | 細節指數:3 | 重要指數:3

      字符串初始化

      難度指數:2 | 細節指數:3 | 重要指數:4

      君不見 size_t 哪里來?

      strlen 與 sizeof的不同

      難度指數:2 | 細節指數:4 | 重要指數:3

      memset函數

      難度指數:2 | 細節指數:2 | 重要指數:3

      基本操作函數篇

      strcmp:比較字符串

      strcpy:復制字符串

      strcat:拼接字符串

      字符串處理能力能夠反映出一個程序員的技術功底

      曾幾何時,看到過這么一句話:字符串處理能力能夠反映出一個程序員的技術功底。

      這句話我一直在理解,每到一個階段,都會有不同的理解。

      時至今日,我的理解還是比較淺薄的,在算法題中,字符串的重要程度跟指針等絕對是不能同日而語的。

      但是在開發中,IO過程就是核心了。

      作為IO過程的組成部分,字符串處理就是這個核心中的核心了、

      基礎掃盲篇

      字符串字面量

      字符串字面量一般分配在只讀內存中,所以是不可變的。

      字符串字面量在哪里使用,是否全局、靜態、局部,都無所謂的。

      大部分編譯器會將字符串字面量看做常量,無法修改字符串,不過有些編譯器會不一樣,碧如GCC。

      #include #include int main() { //char* test = "asdfg"; //直接報錯:const char* 類型的值不能為char*類型的實體賦值 /*char* test = (char*)malloc(10); test = "qwr";*/ //依舊不行 const char* test = "asdfg"; //將字符串初始化為常量可以解決一部分問題 //還有一個不錯的方法,叫做粘貼上去,后面會講 //也可以從鍵盤輸入 }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      字符串初始化

      要說的話都在注釋里了:

      #include #include int main() { char test[10] = "asdfghjkl"; //記住,這里的位置要留一個給'

      #include #include int main() { char test[10] = "asdfghjkl"; //記住,這里的位置要留一個給'\0' //能這樣做,說明什么?說明test也是個const? test[3] = 'g'; //顯然不是的 //那么上面那個賦值語句是什么意思呢? //可以理解為,將字符串字面量取出遍歷,一個一個的放進字符數組中 char test[10]; test = "asdfghjkl"; //報錯,表達式必須是可修改的左值 //不能把字符串字面量的地址賦給數組名字 }

      ' //能這樣做,說明什么?說明test也是個const? test[3] = 'g'; //顯然不是的 //那么上面那個賦值語句是什么意思呢? //可以理解為,將字符串字面量取出遍歷,一個一個的放進字符數組中 char test[10]; test = "asdfghjkl"; //報錯,表達式必須是可修改的左值 //不能把字符串字面量的地址賦給數組名字 }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      君不見 size_t 哪里來?

      size_t 類型定義在cstddef頭文件中,該文件是C標準庫的頭文件stddef.h的C++版。它是一個與機器相關的

      unsigned

      類型,其大小足以保證存儲內存中對象的大小。

      在C++中,設計size_t 就是為了適應多個平臺的。size_t的引入增強了程序在不同平臺上的可移植性。size_t是針對系統定制的一種數據類型,一般是整型,因為C/C++標準只定義最低的位數,而不是必需的固定位數。而且在內存里,對數的高位對齊存儲還是低位對齊存儲各系統都不一樣。為了提高代碼的可移植性,就有必要定義這樣的數據類型。一般這種類型都會定義到它具體占幾位內存等。當然,有些是編譯器或系統已經給定義好的。經測試發現,在32位系統中size_t是4字節的,而在64位系統中,size_t是8字節的,這樣利用該類型可以增強程序的可移植性。

      strlen 與 sizeof的不同

      strlen 是一個

      函數

      ,所以需要進行一次函數調用,它用來計算指定字符串 str 的長度,但

      不包括結束字符

      (即 null 字符)

      關鍵字 sizeof 是一個

      單目運算符

      ,而不是一個函數。與函數 strlen 不同,它的參數可以是數組、指針、類型、對象、函數等

      這里需要特別注意的是,函數 strlen 返回的是一個類型為 size_t 的值,從而有可能讓程序導致意想不到的結果,如下面的示例代碼所示:

      /*判斷一*/ if(strlen(x)>= strlen(y)) { } /*判斷二*/ if(strlen(x)- strlen(y)>= 0) { }

      1

      2

      3

      4

      5

      6

      7

      8

      從表面上看,上面的兩個判斷表達式完全相等,但實際情況并非如此。其中,判斷表達式一沒什么問題,程序也能夠完全按照預想的那樣工作;但判斷表達式二的結果就不一樣了,它將永遠是真:

      原因很簡單,因為函數 strlen 的返回結果是 size_t 類型(即無符號整型),而 size_t 類型絕不可能是負的。

      同樣,就算表達式中同時包含了有符號整數和無符號整數,還是有可能產生意想不到的結果:

      /*判斷一*/ if(strlen(x)>= 5) { } /*判斷二*/ if(strlen(x)- 5>=0) { }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      原因同上、

      sizeof 在編譯時計算緩沖區的長度。也正是由于在編譯時計算,因此 sizeof 不能用來返回動態分配的內存空間的大小。

      memset函數

      本來這個不應該在這里講的,但是前面講漏了,所以這里補一下:

      memset 函數的第三個參數 n 的值一般用 sizeof() 獲取,這樣比較專業。注意,如果是對指針變量所指向的內存單元進行清零初始化,那么一定要先對這個指針變量進行初始化,即一定要先讓它指向某個有效的地址。而且用memset給指針變量如p所指向的內存單元進行初始化時,n 千萬別寫成 sizeof§,這是新手經常會犯的錯誤。因為 p 是指針變量,不管 p 指向什么類型的變量,sizeof§ 的值都是 4。

      拿捏住C字符串,這個煩人程度不亞于指針的小東西

      基本操作函數篇

      strcmp:比較字符串

      int strcmp(const char* str1,const char* str2); //str1>str2,返回正數 //str1

      1

      2

      3

      4

      5

      6

      strcpy:復制字符串

      char* strcpy(char* str1,const char* str2); //其實就是兩個指針引用同一個字符串

      1

      2

      strcat:拼接字符串

      char* strcat(char* s1,const char* s2); //第一個參數的地址必須足夠長,不然越界了,就是會有未知的風險了 //注意,這些函數的參數類型、和返回值類型,別搞錯了

      1

      2

      3

      4

      后期寫完C++會補上關于C++字符串的操作,所以各位如果覺得缺了點啥,可以發在評論區,我們一起看看

      C++ 數據結構

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:wps是英文版怎么改成中文版(如何把英文版的wps改為中文版)
      下一篇:Excel 根據已有的工作表名稱即制定名稱批量生成工作表(excel下拉選擇項怎么設置)
      相關文章
      亚洲AV无码一区二区三区久久精品| 亚洲一卡2卡4卡5卡6卡在线99| 亚洲精品久久无码av片俺去也| 亚洲成人免费网址| 亚洲视频精品在线| 亚洲欧洲国产精品你懂的| 久久亚洲精品成人综合| 亚洲AV无码专区亚洲AV伊甸园| 亚洲国产精品一区二区成人片国内| 亚洲综合色婷婷七月丁香| 久久精品国产精品亚洲艾草网美妙 | 中国亚洲呦女专区| 亚洲第一男人天堂| 最新亚洲卡一卡二卡三新区| 亚洲人xxx日本人18| 中文字幕无码亚洲欧洲日韩| 亚洲人成色777777精品| 亚洲欧美日韩自偷自拍| 99亚洲乱人伦aⅴ精品| 精品韩国亚洲av无码不卡区| 亚洲А∨精品天堂在线| 亚洲精品国产电影| 伊人久久亚洲综合| 亚洲gv猛男gv无码男同短文| 亚洲男人的天堂在线播放| 91大神亚洲影视在线| 久久久久久久亚洲Av无码 | 午夜亚洲国产成人不卡在线| 亚洲精品成人a在线观看| 国产亚洲午夜高清国产拍精品| 中文字幕久久亚洲一区| 亚洲大尺度无码专区尤物| 亚洲一区二区中文| 亚洲剧情在线观看| 亚洲精品蜜夜内射| 亚洲国产天堂久久综合| 亚洲色成人网站WWW永久| 久久91亚洲精品中文字幕| 亚洲激情黄色小说| 亚洲精品无码专区| 亚洲欧洲久久久精品|