實用字串操作指南

2022-07-10 04:30:17 字數 4965 閱讀 2990

字串解析不難,但容易手忙腳亂,所以這裡整理一下實用的字串操作。

寬位元組這裡不做討論。

函式定義如下:

// 定義於標頭檔案 int       atoi(const char *str);

long atol(const char *str);

long long atoll(const char *str);

功能是轉譯str所指的位元組字串中的整數值。

捨棄任何空白字元,直至找到首個非空白字元,然後接收盡可能多的字元以組成合法的整數表示,並將其轉換為整數值。

可以消除前導零,正負號必須在前導零之前,否則,轉譯的結果是 0。

若轉換值超出範圍,則行為未定義;若不能進行轉換,則返回 0。

atoi是 「ascii to integer」 的縮寫。

函式定義如下:

// 定義於標頭檔案 double atof(const char* str);
轉譯str所指向的位元組字串中的浮點值。

函式會捨棄所有由isspace()確定的空白字元,直至找到首個非空白字元。然後它會盡可能多地取字元,以構成合法的浮點數表示,並將它們轉換成浮點值。合法的浮點數如下:

十六進製制浮點數,由下列部分組成:

無窮大,它由下列部分組成

非數(nan)表示式,它由下列部分組成:

以下遇到的合法的浮點數表示都是這個。

若轉換值超出範圍,返回值未定義;若不能轉換,則返回0.0

函式定義如下:

// 定義於標頭檔案 long strtol(const char *str, char **str_end, int base);

long long strtol(const char *str, char **str_end, int base);

轉譯str所指向的位元組字串中的整數值。功能同atoi

不同的是,函式設定的str_end在完成轉譯之後會指向最後被轉譯的後乙個字元。若str_end為空,則可以忽略它。此外,還可以通過設定引數base(底數)設定數值進製,例如 2、8、10、16等,底數的合法集是 。底數 2 對應的合法數字集是 ,底數 3 對應的合法數字集是 ,以此類推。對於大於 10 的底數,合法數字包含字母字元,從對於底數 11 的 aa 到對於底數 36 的 zz。

如果底數base為 0,那麼會自動檢測數值進製:若字首為 0,則為八進位制;若字首為0x0x,則為十六進製制;否則為十進位制。

若轉換值超出對應型別的範圍外,則發生值域錯誤;若不能進行轉換,則返回0

簡單應用,利用str_end指向最後乙個被轉譯字元的後乙個字元的特性擷取 ip 位址。

#include #include #include using namespace std;

int main()

上述程式輸出為:

pend 0x7fffea6f56b0 point to next element "."    pend stand for .168.0.1

pend 0x7fffea6f56b0 point to next element "." pend stand for .0.1

pend 0x7fffea6f56b0 point to next element "." pend stand for .1

pend 0x7fffea6f56b0 point to next element "" pend stand for

strtoulstrtoullstrtolstrtoull,雖然轉譯的是無符號整數值,但也能轉譯負數。

函式定義如下:

// 定義於標頭檔案 float       strtof(const char *str, char **str_end);

double strtod(const char *str, char **str_end);

long double strtold(const char *str, char **str_end);

strtol等一樣,但需要注意的是,引數中沒有底數base,不過規定了合法的浮點數,和atof相同。

函式定義如下:

// 定義於標頭檔案 int       stoi(const std::string& str, std::size_t* pos = 0, int base = 10);

long stol(const std::string& str, std::size_t* pos = 0, int base = 10);

long long stoll(const std::string& str, std::size_t* pos = 0, int base = 10);

轉譯字串str中的有符號整數值。其上三個內部分別呼叫strtolstrtolstrtoll

同樣,還是捨棄空白符,盡可能多地組成底數為base的整數表示。合法的整數值由下列部分組成:

底數的合法集同樣是 ,若base為 0,則自動檢測數值進製。

注意stoiposstrtol中的str_end不同,它表示的是已處理字元的個數的位址,已處理字元的個數保留在*pos中,這點和strtol不同。

可以將上述的分割 ip 位址的例子改為由stoi實現。

#include #include using namespace std;

int main()

return 0;

}

基本同stolstoll

函式定義如下:

// 定義於標頭檔案 float stof(const std::string& str, std::size_t* pos = 0);

double stod(const std::string& str, std::size_t* pos = 0);

long double stold(const std::string& str, std::size_t* pos = 0);

注意合法的浮點值。

函式定義如下:

// 定義於標頭檔案 std::string to_string(int value);

std::string to_string(long value);

std::string to_string(long long value);

std::string to_string(unsigned value);

std::string to_string(unsigned long value);

std::string to_string(unsigned long long value);

std::string to_string(float value);

std::string to_string(double value);

std::string to_string(long double value);

把給定的十進位制數轉換為字串,返回轉換後的字串。

除了atoi沒有明確使用isspace()檢測空白字元,其餘所有數值轉換函式都使用isspace()檢測空白字元。所謂空白字元包括:

c 風格字串

符號引數

進製atoi,atol,atoll

有符號1 個,要轉換的位元組字元

atof

有符號1 個,要轉換的位元組字元。

進製自動判斷,支援 8、10、16 進製

strtol,strtoll

有符號3 個,要轉換的位元組字元,轉換後的下乙個位置的指標,底數。

支援 0、2、3、……36 進製,8、10、16 進製可自動判斷

strtoul,strtoull

無符號3 個,要轉換的位元組字元,轉換後的下乙個位置的指標,底數。

支援 0、2、3、……36 進製,8、10、16 進製可自動判斷

strtof,strtod,strtold

有符號2個,要轉換的位元組字元,轉換後的下乙個位置的指標。

進製自動判斷,支援 8、10、16 進製

c++ 風格字串

符號引數

進製stoi, stol, stoll

有3 個,要轉換的字串,儲存已處理字元的數量的位址,底數

支援 0、2、3、……、36 進製,底數為 0 時自動判斷八進位制和十六進製制

stoul, stoull

無3 個,要轉換的字串,儲存已處理字元的數量的位址,底數

同上stof, stod, stold

有3 個,要轉換的字串,儲存已處理字元的數量的位址

strtof

C 常用字串操作

獲得漢字的區位碼 byte array new byte 2 array system.text.encoding.default.getbytes 啊 int i1 short array 0 0 int i2 short array 1 0 unicode解碼方式下的漢字碼 array syst...

常用字串操作函式

1 字串copy函式strcpy,實現如下 include char mystrcpy char dest,const char sor 將源字元sor串拷到目的字串dest return ret 2 判斷乙個字串中的子字串strstr,實現如下 include include char mystr...

常用字串操作函式

strtolower 字串 轉換成小寫 strtoupper 字串 轉換成大寫 ucfirst 字串 首字母大寫 strrev 字串 按位元組翻轉字串,所以中文不能翻轉 strpos 在哪個字串中查詢,需要查詢的字元 查詢某個字元在字串中第一次存在的位置 從左往右 strrpos 在哪個字串中查詢,...