C和C++字串處理整理
標籤: c c++
在刷leetcode題目的過程中,發現自己對於c和c++字串的處理並不是很拿手,處理起來比較費勁,而且,演算法題似乎很中意字串的處理,有很多題目都涉及到它。字串處理比較基礎,但是很重要,因此,整理和深入學習字串的處理對於後續的學習來說擁有巨大的作用。
首先,看C語言環境下對於字串的處理方式:
c語言中沒有string類,其對字串的儲存都是利用char陣列實現的,其對字串的管理主要從以下幾個方面展開:
一、字串的初始化
c語言中,字串初始化有三種方式:
(1) char str1[] = "hello"
: 此種初始化方式,預設在字串最後新增'\0';
(2)char str2[] = {'h','e','l','l','o','\0'}
(3)
char *pstr = "hello"
:該種方式看似和第(1)中方式類似,其實不然。該種方式初始化的字串是字串常量,其內容儲存在靜態資料區,不可更改。該方式初始化時的操作為:先在靜態資料區分配記憶體儲存該字串常量,然後,將其地址賦值給pstr指標,所以,該種方式是字串常量,不可更改。
二、字元型別判斷
字串型別判斷的函式包含在 < ctype.h>標頭檔案中,其中主要定義了判斷一個字元的型別的函式。
int isalnum(int ch)
int isalpha(int ch)
:判斷所給字元是否是拼音(包括大寫和小寫字母)。int islower/isupper(int ch)
:判斷所給字元是否是大/小寫字母。int isdigit(int ch)
:判斷所給字元是否是數字int iscntrl(int ch)
:判斷所給字元是否是控制字元int isspace(int ch)
:判斷所給字元是否是空格等等
三、字串與整型、浮點型的轉換
1.字串與其他型別的轉換函式包含在< stdlib.h>標頭檔案中,主要包括:
(1)double atof(const char* str)
(2)
int atoi/atol/atoll(const char* str)
:字串轉整型(3)
strtol/strtoll/strtoul/strtoull/strtof(const char* str)
:字串轉整型、無符號整數等2.整型轉字串
itoa/ltoa/ultoa
四、字串常用操作
(1)char *strcpy(char *dest, const char *src)
:字串拷貝
(2)int strcmp(const char *lhs, const char *rhs)
:字串比較
(3)char *strcat(char *dest, const char *src)
:字串追加
(4)size_t strlen(const char *str)
:字串長度
(5)char *strchr(const char *str, int ch)
:在str中查詢字元ch,返回以ch為開頭的子串
(6)char *strstr(const char *str, const char *substr)
:查詢子串,並返回子串的位置
五、字元陣列常用操作(記憶體操作)
(1)void* memchr(const void* ptr, int ch, size_t count)
:在指定長度字串中查詢字元ch,並返回以ch開頭的子串
(2)int memcmp(const char* lhs, const void* rhs, size_t count)
:字串比較
(3)void* memset(void* dst, int ch, size_t count)
:用同一個字元填充記憶體區域
(4)void* memcpy(void* dst, const void* src, size_t count)
:字串拷貝
(5)void* memmove( void* dst, const void* src, size_t count)
:字串移動
值得注意的是,char陣列表示字串時,最後一定要加上‘\0’,及NUL字元,代表字串的結束。用於遍歷字串的很多操作都是基於NUL字元作判斷的。
然後,我們再來看一下C++環境下對於字串的處理操作:
c++相對於c語言來說,對於字串的操作進行了優化,c++專門提供了string模板類專門對字串進行處理,大大提高了對字串的處理能力。
一、字串初始化
C++中 string類定義在< string>標頭檔案中,因為string是一個模板類,所以它對於字串的初始化都是通過建構函式實現的。string有如下幾種常用的初始化方式。
建構函式 -> 語法樣例
(1)string::string() -> std::string s
(2)string::string(size_type count, charT ch) -> std::string s(4, '=')
//s = "===="
(3)string::string(string const& other, size_type pos, size_type count) -> std::string s(other, 0, other.length())
(4)string::string(charT const* s, size_type count) -> std::string s("c-type string", 14)
(5)string::string(charT const* s) -> std::string s("c-type string")
二、字串賦值
c++字串可以使用operator=
或者是assign
函式對字串型別變數進行賦值。
(1)string s = "1234rdf"
//運算子=過載
(2)assign(size_type count, charT ch)
(3)assign(basic_string const& str)
(4)assign(basic_string const& str, size_type pos, size_type count)
(5)assign(basic_string&& str) -> s.assign(std::string("c++ by") + "example")
(6)assign(charT const* s, size_type count)
(7)assign(charT const* s)
三、字串與整型、浮點型轉換
C++提供了更為友好和更為靈活的字串與其他型別轉換的新的介面函式,主要包括stoi、stol、stoll、stoul、stoull、stof、stod、stold以及to_string
(1)字串轉整型/浮點型:stoX
系列函式增加了進位制引數,使更靈活。如int stoi(const std::string& str, std::size_t* pos = 0, int base = 10);
(2)整型/浮點型轉字串:std::string to_string(int/long/long long/unsigned long/float/double value)
(3)字串與c字元陣列的轉換:s.c_str()
四、字串操作
一方面,c++字串的操作都包含在< string>標頭檔案中,比較集中,API文件描述很清楚;另一方面,已經有很多人總結了其用法,可參見https://www.cnblogs.com/lidabo/p/3487043.html,該篇文章詳細介紹了c++字串的相關操作,此處不再贅述。
參考資料
[1]c和c++字串處理大集合.https://www.cnblogs.com/lidabo/p/3487043.html
[2]c和c++ API文件