C++常用字符串函數(shù)大全(2)
1、cstring.h常用函數(shù)介紹
cstring.h
庫即C語言中的string.h
庫,它是C語言中為字符串提供的標(biāo)準(zhǔn)庫。C++對此進(jìn)行了兼容,所以我們在C++當(dāng)中一樣可以使用。
這個庫當(dāng)中有大量的關(guān)于字符串操作的api
,本文選擇了其中最常用的幾個進(jìn)行闡述。
2、strlen
由于編譯器是按照\0的位置來確定字符串的結(jié)尾的,所以字符串的長度并不等于數(shù)組的長度。
我們可以使用strlen函數(shù)求得字符串的真實(shí)長度:
char name[100] = "hello world"; cout << strlen(name) << endl;
比如我們這里用一個長度為100的char
數(shù)組存儲了“helloworld
”字符串,當(dāng)我們使用strlen
函數(shù)求它的實(shí)際長度只有11。
3、strcat
strcat函數(shù)可以將兩個字符串進(jìn)行拼接,它的函數(shù)簽名為:
char *strcat(char *dest, const char *src)
我們可以看到它接受兩個參數(shù),一個是dest
,一個是src
,都是char
*類型,返回的結(jié)果也為char
*類型。在C++當(dāng)中,數(shù)組名是指向數(shù)組中第一個元素的常量指針。所以雖然簽名中寫的參數(shù)是指針類型,但我們傳入數(shù)組名同樣可以。
我們傳入兩個字符串之后,strcat
函數(shù)會將src
字符串拼接在dest
字符串末尾,并且返回指向拼接之后結(jié)果的指針。
所以下面兩種方式輸出結(jié)果得到的值是一樣的。
char name[100] = "hello world"; char level[100] = "concat test"; char *ret = strcat(name, level); cout << ret << endl; // 方式1 cout << name << endl; // 方式2
4、strncat
strcat函數(shù)的變種,函數(shù)額外多接收一個參數(shù)控制拷貝src字符串的最大長度。
char *strncat(char *dest, const char *src, size_t n)
我們使用剛才同樣的例子:
char name[100] = "hello world"; char level[100] = "concat test"; char *ret = strncat(name, level, 4); cout << ret << endl; cout << name << endl;
由于我們傳入了4,限制了level
字符串拷貝的長度,所以最終得到的結(jié)果為:hello worldconc。
5、strcpy
字符串拷貝函數(shù),可以將src
字符串中的內(nèi)容復(fù)制到dest
。
char *strcpy(char *dest, const char *src)
使用方法和前面介紹的其他函數(shù)類似,有兩點(diǎn)需要注意。
如果dest
字符串長度不夠長,在編譯時不會報錯,但運(yùn)行時可能導(dǎo)致問題。
char name[10] = ""; char level[100] = "concat test"; strcpy(name, level); cout << name << endl;
上面這段代碼可以編譯運(yùn)行,但是運(yùn)行的時候終端會出現(xiàn)出錯信息。
所以在使用strcpy
的時候千萬小心,一定要保證dest
有足夠長度。
如果dest中原本就有內(nèi)容,會被覆蓋。
char name[15] = "abc"; char level[100] = "concat test"; strcpy(name, level); cout << name << endl;
運(yùn)行完strcpy
之后,name
中的內(nèi)容會被清空。
6、strncpy
strcpy
加入長度限制的版本,可額外多傳入一個參數(shù)n表示最多賦值n個字符。當(dāng)src
長度小于n時,剩余部分將會使用空字節(jié)填充。
char *strncpy(char *dest, const char *src, size_t n) char name[15] = "abc"; char level[100] = "concat test"; strncpy(name, level, 4); cout << name << endl;
輸出結(jié)果為conc。
7、memset
字符串的批量設(shè)置函數(shù),可以將字符串批量設(shè)置成某一個字符。
void *memset(void *str, int c, size_t n)
int c
表示要被設(shè)置的字符,size_t n
表示設(shè)置的字符數(shù)量。
char name[15] = "abc"; char level[100] = "concat test"; memset(name, 'c', 10); cout << name << endl;
上述代碼的運(yùn)行結(jié)果為10個c。
多說一句,memset
除了可以用來給字符串進(jìn)行批量設(shè)置之外也可以給int型的數(shù)組進(jìn)行批量設(shè)置。由于一個32位的int占據(jù)4個字節(jié),也就是4個字符長度。所以使用memset
進(jìn)行批量設(shè)置的時候,最終得到的結(jié)果將是4個傳入的int c
拼接的結(jié)果。
int a[100]; memset(a, 1, sizeof a); // memset(a, 1, 400); 因?yàn)橐粋€int占據(jù)4個字節(jié)
我們這樣設(shè)置之后,a數(shù)組當(dāng)中的元素并不是1,而是0x01010101
,轉(zhuǎn)成10進(jìn)制是16843009
。
所以使用memset
對int
型數(shù)組進(jìn)行初始化一般只用3種操作:
// 1. 批量設(shè)置成0 memset(a, 0, sizeof a); // 2. 批量設(shè)置成-1 memset(a, -1, sizeof a); // 3. 批量設(shè)置成一個接近最大整數(shù)上限的值 memset(a, 0x7f, sizeof a); memset(a, 0x3f, sizeof a);
關(guān)于memset
使用的一些具體細(xì)節(jié)將在后續(xù)題解的實(shí)際問題當(dāng)中再做詳細(xì)說明。
8、memcpy
和strcpy
類似,從str2中復(fù)制N個字符到str1中。
void *memcpy(void *str1, const void *str2, size_t n) char name[15] = "abc"; char level[100] = "concat test"; memcpy(name, level, 10);
9、strcmp
將兩個字符串按照字典順序進(jìn)行比較,對于字典序的順序定義為:兩個字符串自左向右逐個字符相比(按 ASCII 值大小相比較),直到出現(xiàn)不同的字符或遇 \0 為止。
int strcmp(const char *str1, const char *str2)
返回的結(jié)果為一個int,如果它小于0,說明str1
小于str2
,如果它等于0,說明兩者相等,如果大于0,說明str1
大于str2
。
char name[15] = "abc"; char level[100] = "abcd"; cout << strcmp(name, level) << endl;
運(yùn)行結(jié)果為-100,說明name小于level。
10、strncmp
strcmp
長度限制版,可以額外接受一個數(shù)字n,表示最多比較長度為n的字符。
int strncmp(const char *str1, const char *str2, size_t n)
11、strstr
char *strstr(const char *haystack, const char *needle)
在haystack
中搜索needle
第一次出現(xiàn)的位置,返回指向該位置的指針。
char name[15] = "search-test"; char level[100] = "-"; char *ret = strstr(name, level); cout << ret << endl;
運(yùn)行之后,屏幕輸出的結(jié)果為:
因?yàn)楫?dāng)我們使用cout
輸出一個char *
變量的時候,它會當(dāng)做是字符串進(jìn)行輸出,即一直輸出字符,直到遇見\0
為止。
輸出的結(jié)果為-test
,說明我們通過strstr
函數(shù)找到了“-
”出現(xiàn)的位置,跳過了之前的內(nèi)容。
除了上文介紹的這些函數(shù)之外,cstring
當(dāng)中還有很多其他的api
,例如strtok
,memmove
等等,大家感興趣不妨去翻閱相關(guān)文檔,也許會有驚喜。
到此這篇關(guān)于C++常用字符串函數(shù)大全的文章就介紹到這了,更多相關(guān)C++常用字符串函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
注:文章轉(zhuǎn)自微信公眾號:Coder梁(ID:Coder_LT)
- C++頭文件algorithm中的函數(shù)功能詳解
- 簡單談?wù)凜++ 頭文件系列之(algorithm)
- 詳解C++中的萬能頭文件
- 關(guān)于VS2022不能使用<bits/stdc++.h>的解決方案(萬能頭文件)
- C++ Boost Algorithm算法超詳細(xì)精講
- C++實(shí)現(xiàn)分水嶺算法(Watershed Algorithm)
- C++詳細(xì)講解常用math函數(shù)的用法
- 詳解C++字符串常用操作函數(shù)(查找、插入、截取、刪除等)
- c++中的string常用函數(shù)用法總結(jié)
- C++常用函數(shù)總結(jié)(algorithm 頭文件)
相關(guān)文章
在C++17中實(shí)現(xiàn)無鎖數(shù)據(jù)結(jié)構(gòu)的方法詳解
在探索?C++17?中的無鎖數(shù)據(jù)結(jié)構(gòu)之前,我們首先需要理解無鎖編程的基本概念及其在現(xiàn)代軟件開發(fā)中的重要性,在這個章節(jié)中,我們將深入探討無鎖編程的概念,以及它如何滿足人類對于更高效、更可靠軟件的本能需求,文中通過代碼示例介紹的非常詳細(xì),感興趣的朋友可以參考下2023-12-12C語言數(shù)據(jù)結(jié)構(gòu)之判斷循環(huán)鏈表空與滿
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之判斷循環(huán)鏈表空與滿的相關(guān)資料,希望通過本文能幫助到大家,讓大家掌握這部分內(nèi)容,需要的朋友可以參考下2017-10-10