溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++常用字符串函數有哪些

發(fā)布時間:2021-11-03 13:37:29 來源:億速云 閱讀:375 作者:iii 欄目:開發(fā)技術

本篇內容主要講解“C++常用字符串函數有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“C++常用字符串函數有哪些”吧!

1、cstring.h常用函數介紹

cstring.h庫即C語言中的string.h庫,它是C語言中為字符串提供的標準庫。C++對此進行了兼容,所以我們在C++當中一樣可以使用。

這個庫當中有大量的關于字符串操作的api,本文選擇了其中最常用的幾個進行闡述。

2、strlen

由于編譯器是按照\0的位置來確定字符串的結尾的,所以字符串的長度并不等于數組的長度。

我們可以使用strlen函數求得字符串的真實長度:

char name[100] = "hello world";
cout << strlen(name) << endl;

比如我們這里用一個長度為100的char數組存儲了“helloworld”字符串,當我們使用strlen函數求它的實際長度只有11。

3、strcat

strcat函數可以將兩個字符串進行拼接,它的函數簽名為:

char *strcat(char *dest, const char *src)

我們可以看到它接受兩個參數,一個是dest,一個是src,都是char*類型,返回的結果也為char *類型。在C++當中,數組名是指向數組中第一個元素的常量指針。所以雖然簽名中寫的參數是指針類型,但我們傳入數組名同樣可以。

我們傳入兩個字符串之后,strcat函數會將src字符串拼接在dest字符串末尾,并且返回指向拼接之后結果的指針。

所以下面兩種方式輸出結果得到的值是一樣的。

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函數的變種,函數額外多接收一個參數控制拷貝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字符串拷貝的長度,所以最終得到的結果為:hello worldconc。

5、strcpy

字符串拷貝函數,可以將src字符串中的內容復制到dest

char *strcpy(char *dest, const char *src)

使用方法和前面介紹的其他函數類似,有兩點需要注意。

如果dest字符串長度不夠長,在編譯時不會報錯,但運行時可能導致問題。

char name[10] = "";
char level[100] = "concat test";

strcpy(name, level);
cout << name << endl;

上面這段代碼可以編譯運行,但是運行的時候終端會出現出錯信息。

C++常用字符串函數有哪些

所以在使用strcpy的時候千萬小心,一定要保證dest有足夠長度。

如果dest中原本就有內容,會被覆蓋。

char name[15] = "abc";
char level[100] = "concat test";

strcpy(name, level);
cout << name << endl;

運行完strcpy之后,name中的內容會被清空。

6、strncpy

strcpy加入長度限制的版本,可額外多傳入一個參數n表示最多賦值n個字符。當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;

輸出結果為conc。

7、memset

字符串的批量設置函數,可以將字符串批量設置成某一個字符。

void *memset(void *str, int c, size_t n)

int c表示要被設置的字符,size_t n表示設置的字符數量。

char name[15] = "abc";
char level[100] = "concat test";

memset(name, 'c', 10);
cout << name << endl;

上述代碼的運行結果為10個c。

多說一句,memset除了可以用來給字符串進行批量設置之外也可以給int型的數組進行批量設置。由于一個32位的int占據4個字節(jié),也就是4個字符長度。所以使用memset進行批量設置的時候,最終得到的結果將是4個傳入的int c拼接的結果。

int a[100];
memset(a, 1, sizeof a); // memset(a, 1, 400); 因為一個int占據4個字節(jié)

我們這樣設置之后,a數組當中的元素并不是1,而是0x01010101,轉成10進制是16843009。

所以使用memsetint型數組進行初始化一般只用3種操作:

// 1. 批量設置成0
memset(a, 0, sizeof a);
// 2. 批量設置成-1
memset(a, -1, sizeof a);
// 3. 批量設置成一個接近最大整數上限的值
memset(a, 0x7f, sizeof a);
memset(a, 0x3f, sizeof a);

關于memset使用的一些具體細節(jié)將在后續(xù)題解的實際問題當中再做詳細說明。

8、memcpy

strcpy類似,從str2中復制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

將兩個字符串按照字典順序進行比較,對于字典序的順序定義為:兩個字符串自左向右逐個字符相比(按 ASCII 值大小相比較),直到出現不同的字符或遇 \0 為止。

int strcmp(const char *str1, const char *str2)

返回的結果為一個int,如果它小于0,說明str1小于str2,如果它等于0,說明兩者相等,如果大于0,說明str1大于str2。

char name[15] = "abc";
char level[100] = "abcd";

cout << strcmp(name, level) << endl;

運行結果為-100,說明name小于level。

10、strncmp

strcmp長度限制版,可以額外接受一個數字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第一次出現的位置,返回指向該位置的指針。

char name[15] = "search-test";
char level[100] = "-";

char *ret = strstr(name, level);
cout << ret << endl;

運行之后,屏幕輸出的結果為:

C++常用字符串函數有哪些

因為當我們使用cout輸出一個char *變量的時候,它會當做是字符串進行輸出,即一直輸出字符,直到遇見\0為止。

輸出的結果為-test,說明我們通過strstr函數找到了“-”出現的位置,跳過了之前的內容。

到此,相信大家對“C++常用字符串函數有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI