1629. 按鍵持續時間最長的鍵
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
1
2
3
4
5
6
7
8
9
10
11
12
字符串初始化
要說的話都在注釋里了:
#include #include
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。
基本操作函數篇
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小時內刪除侵權內容。