1. 程式人生 > >C和C++字串處理整理

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'}

:標準C風格的字串初始化格式,即為字串陣列,切記不要忘記最後的'\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文件