溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++中string庫(kù)函數(shù)的作用是什么和怎么使用

發(fā)布時(shí)間:2022-04-24 13:42:45 來(lái)源:億速云 閱讀:185 作者:iii 欄目:開發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“C++中string庫(kù)函數(shù)的作用是什么和怎么使用”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“C++中string庫(kù)函數(shù)的作用是什么和怎么使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。

1.strlen函數(shù)

是什么?

strlen函數(shù)是string頭文件中最常見的一個(gè)函數(shù),用于求字符串的長(zhǎng)度。 strlen英文全稱string length,既字符串長(zhǎng)度,可以顧名思義地來(lái)記憶。

具體用法:

C++中string庫(kù)函數(shù)的作用是什么和怎么使用

?這是從c++ reference上截取的介紹,strlen函數(shù)的用法就是向其傳入一個(gè)字符串?dāng)?shù)組的首元素地址,其返回值是字符的個(gè)數(shù)。

?演示代碼如下:

#include<string.h>
int main()
{
	char str[] = "abc";
	int len1 = strlen(str);
	int len2 = strlen("abc");
	printf("%d\n%d", len1,len2);

	return 0;
}

!!這里應(yīng)該注意的是,"abc"表示的也是一個(gè)字符串?dāng)?shù)組,其傳給strlen函數(shù)的是首元素地址。

運(yùn)行結(jié)果:

C++中string庫(kù)函數(shù)的作用是什么和怎么使用

下面我們?cè)囍\(yùn)行一下這個(gè)代碼:

#include<string.h>
int main()
{
	char str1[] = "abc";
	int len1 = strlen(str1);
	char str2[] = { 'a','b','c'};
	int len2 = strlen(str2);
	printf("%d\n%d", len1,len2);

	return 0;
}

運(yùn)行結(jié)果:

C++中string庫(kù)函數(shù)的作用是什么和怎么使用


?為什么這里的str2的長(zhǎng)度會(huì)是13呢?乍一看不是abc三個(gè)元素,長(zhǎng)度為3嗎?

這里需要補(bǔ)充一個(gè)知識(shí)點(diǎn)。在C語(yǔ)言中,系統(tǒng)會(huì)在字符串?dāng)?shù)組最后加上一個(gè)&rsquo;\0&rsquo;作為結(jié)束標(biāo)志。而strlen函數(shù)的工作原理就是計(jì)算傳入數(shù)組 (首元素地址指針指向的數(shù)組)在&rsquo;\0&rsquo;之前的元素個(gè)數(shù),既該字符串長(zhǎng)度。
而該代碼塊中所定義的str數(shù)組并不是一個(gè)字符串?dāng)?shù)組,因此&rsquo;\0&rsquo;的位置并不在最后一個(gè)元素后面,而是一個(gè)隨機(jī)的位置,strlen函數(shù)會(huì)一直計(jì)算長(zhǎng)度直到遇見&rsquo;\0&rsquo;才停止工作并返回結(jié)果。
因此,strlen(str2)會(huì)返回一個(gè)隨機(jī)值,該值不代表該數(shù)組的長(zhǎng)度。
C++中string庫(kù)函數(shù)的作用是什么和怎么使用

通過調(diào)試驗(yàn)證了str1字符串?dāng)?shù)組末端有一個(gè)&rsquo;\0&rsquo;而str2沒有。

2.strcpy函數(shù)

是什么?

strcpy,英文全稱copies strcpy,也是一個(gè)string頭文件中較為常見的函數(shù),用于將一個(gè)字符串的內(nèi)容復(fù)制到另一個(gè)數(shù)組中。

具體用法

C++中string庫(kù)函數(shù)的作用是什么和怎么使用

(再次引用c++ reference中的描述,發(fā)現(xiàn)這種英文的工具網(wǎng)站的描述比中文的清晰地多)

?strcpy的使用方法是向其傳入兩個(gè)指針,前者是目標(biāo)數(shù)組首元素地址指針,后者是原字符串?dāng)?shù)組地址指針,將原字符串?dāng)?shù)組(包括末尾結(jié)束標(biāo)志&rsquo;\0&rsquo;)拷貝到目標(biāo)數(shù)組中。若目標(biāo)數(shù)組中本身具有元素,則根據(jù)原字符串?dāng)?shù)組的長(zhǎng)度一一覆蓋。(?注意:為了防止數(shù)組溢出,目標(biāo)數(shù)組長(zhǎng)度應(yīng)大于原字符串?dāng)?shù)組。)

?演示代碼如下:

#include<string.h>
int main()
{
	char str1[] = "abcdefg";
	char str2[] = "123";
	strcpy(str1, str2);//str2==>str1
	printf("%s", str1);//打印拷貝處理后的str1

	return 0;
}

運(yùn)行結(jié)果:

C++中string庫(kù)函數(shù)的作用是什么和怎么使用

可見,str2的內(nèi)容完美地拷貝到str1中了。

C++中string庫(kù)函數(shù)的作用是什么和怎么使用

通過調(diào)試可以發(fā)現(xiàn),str2的內(nèi)容覆蓋了str1前四個(gè)元素,而后面的元素依然存在。但是因?yàn)閟tr2的&rsquo;\0&rsquo;也跟著拷貝過去了,所以在打印的時(shí)候,由于printf格式控制符是%s(既字符串類型),在遇到第一個(gè)&rsquo;\0&rsquo;時(shí)則認(rèn)為它是字符串結(jié)束標(biāo)志,結(jié)束打印。因此,打印出來(lái)的結(jié)果是字符串"123"。

3.strcmp函數(shù)

是什么?

strcmp函數(shù),英文全稱compares string(字符串比較), 既用于比較兩個(gè)字符串,那么這里是比較字符串的什么呢?這里的比較是這樣的:先比較兩個(gè)字符串的第一個(gè)字符的ASCII碼值(這里視為第一對(duì)字符),(下面的比較均是ASCII碼值的比較)如果第一個(gè)字符串的第一個(gè)字符大于第二個(gè)字符串的第一個(gè)字符,則返回1;反之,則返回-1;若兩個(gè)字符相等,則進(jìn)行下一對(duì)字符的比較,直到出現(xiàn)有一對(duì)字符不同則返回相應(yīng)的值(1或-1)。若兩個(gè)字符串所有的字符都相同,則返回?cái)?shù)字0。

具體用法:

C++中string庫(kù)函數(shù)的作用是什么和怎么使用

傳入兩個(gè)指針,代表兩個(gè)字符串?dāng)?shù)組的首元素地址。

?演示代碼如下:

#include<string.h>
int main()
{
	char str1[20];
	char str2[20];
	scanf("%s%s", str1, str2);
	int ret=strcmp(str1, str2);
	switch (ret)
	{
	case 0:printf("str1=str2");break;
	case 1:printf("str1>str2");break;
	case -1:printf("str1<str2");break;
	}
	return 0;
}

運(yùn)行結(jié)果:

C++中string庫(kù)函數(shù)的作用是什么和怎么使用

C++中string庫(kù)函數(shù)的作用是什么和怎么使用

C++中string庫(kù)函數(shù)的作用是什么和怎么使用

可見,這里的比較和我們所描述的相一致。
?這里應(yīng)該注意,'\0&rsquo;的ASCII碼是0,它與其他字符都小。

4.strcat函數(shù)

是什么?

(先介紹strcat)

strcat,英文全稱concatenates string(連接字符串),這里很容易理解,strcat函數(shù)就是用于連接兩個(gè)字符串的,那么它是如何連接的呢?接下來(lái)我將介紹一下它的具體用法。

具體用法

C++中string庫(kù)函數(shù)的作用是什么和怎么使用

?如圖所示,使用strcat函數(shù)需向其傳入兩個(gè)指針,前者是目標(biāo)數(shù)組首元素地址指針,后者是原字符串?dāng)?shù)組地址指針(與strcpy類似,只不過這里是將原字符串接到目標(biāo)字符串后面)。傳參成功后,strcat會(huì)將原字符串的第一個(gè)字符覆蓋到目標(biāo)字符串的&rsquo;\0&rsquo;位置,后面再接著原字符串剩下的全部字符,直到遇見&rsquo;\0&rsquo;后結(jié)束,保證了拼接后的字符串只有一個(gè)結(jié)束標(biāo)志&rsquo;\0&rsquo;。

?演示代碼如下:

#include<string.h>
int main()
{
	char str1[5]="ab";
	strcat(str1, "cd");
	printf("%s\n", str1);

	char str2[5] = "ab";
	char str3[3] = "cd";
	strcat(str2, str3);
	printf("%s\n", str2);
	return 0;
}//原字符串可以用字符串?dāng)?shù)組也可以直接用字符串,結(jié)果相同

運(yùn)行結(jié)果:

C++中string庫(kù)函數(shù)的作用是什么和怎么使用

如果我們想讓拼接后的字符串更長(zhǎng),能不能修改一下原字符串實(shí)現(xiàn)呢?讓我們來(lái)試試看????

int main()
{
	char str1[5]="ab";
	strcat(str1, "cde");
	printf("%s\n", str1);
}

運(yùn)行結(jié)果:

C++中string庫(kù)函數(shù)的作用是什么和怎么使用

運(yùn)行出錯(cuò),引發(fā)了異常,這是為什么呢?

這里是因?yàn)榘l(fā)生了數(shù)組溢出,由于"cde"字符串加上&rsquo;\0&rsquo;有四個(gè)字符,而str1我們規(guī)定了長(zhǎng)度為5,當(dāng)"cde"拼接在str1后覆蓋了它的&rsquo;\0&rsquo;之后,拼接字符串一共有六個(gè)字符,超過了目標(biāo)字符串str1的長(zhǎng)度,無(wú)法容納拼接后的字符串,所以發(fā)生了錯(cuò)誤。
?由此我們可得,在使用strcat函數(shù)時(shí),要規(guī)定給目標(biāo)字符串一個(gè)合適的長(zhǎng)度,防止數(shù)組溢出。

5.兩個(gè)不太常用的string頭文件函數(shù)

strstr函數(shù)

strstr,英文全稱Locate substring,既定位子字符串。strstr的返回值比較特殊,它是通過傳入一個(gè)母字符串和一個(gè)子字符串,然后在母字符串中定位子字符串的位置,返回值為指向母字符串中第一次出現(xiàn)的子字符串中指定的整個(gè)字符串的指針。若子字符串不屬于母字符串的一部分,則返回空指針NULL。

?演示代碼如下:

#include<string.h>
int main()
{
	char str1[20]="I love you";
	char* p1 = strstr(str1, "you");
	char* p2 = strstr(str1, "me");
	printf("%s\n%s\n", p1,p2);

}

運(yùn)行結(jié)果:

C++中string庫(kù)函數(shù)的作用是什么和怎么使用

memset函數(shù)

memset函數(shù),英文全稱Fill block of memory,既填充內(nèi)存塊。memset的作用是將指針指向的內(nèi)存塊(這里可以認(rèn)為是字符串)的第一個(gè)字節(jié)數(shù)設(shè)置為指定的值。

?演示代碼如下:

#include<string.h>
int main()
{
	char str[20]="I love you";
	memset(str, '-', 2);
	printf("%s\n", str);
	return 0;
}

運(yùn)行結(jié)果:

C++中string庫(kù)函數(shù)的作用是什么和怎么使用

顯而易見,其結(jié)果無(wú)非就是將兩個(gè)&rsquo;-'填充到str字符串的前兩個(gè)位置。

讀到這里,這篇“C++中string庫(kù)函數(shù)的作用是什么和怎么使用”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI