您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“C++中string庫函數的作用是什么和怎么使用”,內容詳細,步驟清晰,細節處理妥當,希望這篇“C++中string庫函數的作用是什么和怎么使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
strlen函數是string頭文件中最常見的一個函數,用于求字符串的長度。 strlen英文全稱string length,既字符串長度,可以顧名思義地來記憶。
?這是從c++ reference上截取的介紹,strlen函數的用法就是向其傳入一個字符串數組的首元素地址,其返回值是字符的個數。
?演示代碼如下:
#include<string.h> int main() { char str[] = "abc"; int len1 = strlen(str); int len2 = strlen("abc"); printf("%d\n%d", len1,len2); return 0; }
!!這里應該注意的是,"abc"表示的也是一個字符串數組,其傳給strlen函數的是首元素地址。
運行結果:
下面我們試著運行一下這個代碼:
#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; }
運行結果:
?為什么這里的str2的長度會是13呢?乍一看不是abc三個元素,長度為3嗎?
這里需要補充一個知識點。在C語言中,系統會在字符串數組最后加上一個’\0’作為結束標志。而strlen函數的工作原理就是計算傳入數組 (首元素地址指針指向的數組)在’\0’之前的元素個數,既該字符串長度。
而該代碼塊中所定義的str數組并不是一個字符串數組,因此’\0’的位置并不在最后一個元素后面,而是一個隨機的位置,strlen函數會一直計算長度直到遇見’\0’才停止工作并返回結果。
因此,strlen(str2)會返回一個隨機值,該值不代表該數組的長度。通過調試驗證了str1字符串數組末端有一個’\0’而str2沒有。
strcpy,英文全稱copies strcpy,也是一個string頭文件中較為常見的函數,用于將一個字符串的內容復制到另一個數組中。
(再次引用c++ reference中的描述,發現這種英文的工具網站的描述比中文的清晰地多)
?strcpy的使用方法是向其傳入兩個指針,前者是目標數組首元素地址指針,后者是原字符串數組地址指針,將原字符串數組(包括末尾結束標志’\0’)拷貝到目標數組中。若目標數組中本身具有元素,則根據原字符串數組的長度一一覆蓋。(?注意:為了防止數組溢出,目標數組長度應大于原字符串數組。)
?演示代碼如下:
#include<string.h> int main() { char str1[] = "abcdefg"; char str2[] = "123"; strcpy(str1, str2);//str2==>str1 printf("%s", str1);//打印拷貝處理后的str1 return 0; }
運行結果:
可見,str2的內容完美地拷貝到str1中了。
通過調試可以發現,str2的內容覆蓋了str1前四個元素,而后面的元素依然存在。但是因為str2的’\0’也跟著拷貝過去了,所以在打印的時候,由于printf格式控制符是%s(既字符串類型),在遇到第一個’\0’時則認為它是字符串結束標志,結束打印。因此,打印出來的結果是字符串"123"。
strcmp函數,英文全稱compares string(字符串比較), 既用于比較兩個字符串,那么這里是比較字符串的什么呢?這里的比較是這樣的:先比較兩個字符串的第一個字符的ASCII碼值(這里視為第一對字符),(下面的比較均是ASCII碼值的比較)如果第一個字符串的第一個字符大于第二個字符串的第一個字符,則返回1;反之,則返回-1;若兩個字符相等,則進行下一對字符的比較,直到出現有一對字符不同則返回相應的值(1或-1)。若兩個字符串所有的字符都相同,則返回數字0。
傳入兩個指針,代表兩個字符串數組的首元素地址。
?演示代碼如下:
#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; }
運行結果:
可見,這里的比較和我們所描述的相一致。
?這里應該注意,'\0’的ASCII碼是0,它與其他字符都小。
(先介紹strcat)
strcat,英文全稱concatenates string(連接字符串),這里很容易理解,strcat函數就是用于連接兩個字符串的,那么它是如何連接的呢?接下來我將介紹一下它的具體用法。
?如圖所示,使用strcat函數需向其傳入兩個指針,前者是目標數組首元素地址指針,后者是原字符串數組地址指針(與strcpy類似,只不過這里是將原字符串接到目標字符串后面)。傳參成功后,strcat會將原字符串的第一個字符覆蓋到目標字符串的’\0’位置,后面再接著原字符串剩下的全部字符,直到遇見’\0’后結束,保證了拼接后的字符串只有一個結束標志’\0’。
?演示代碼如下:
#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; }//原字符串可以用字符串數組也可以直接用字符串,結果相同
運行結果:
如果我們想讓拼接后的字符串更長,能不能修改一下原字符串實現呢?讓我們來試試看????
int main() { char str1[5]="ab"; strcat(str1, "cde"); printf("%s\n", str1); }
運行結果:
運行出錯,引發了異常,這是為什么呢?
這里是因為發生了數組溢出,由于"cde"字符串加上’\0’有四個字符,而str1我們規定了長度為5,當"cde"拼接在str1后覆蓋了它的’\0’之后,拼接字符串一共有六個字符,超過了目標字符串str1的長度,無法容納拼接后的字符串,所以發生了錯誤。
?由此我們可得,在使用strcat函數時,要規定給目標字符串一個合適的長度,防止數組溢出。
strstr,英文全稱Locate substring,既定位子字符串。strstr的返回值比較特殊,它是通過傳入一個母字符串和一個子字符串,然后在母字符串中定位子字符串的位置,返回值為指向母字符串中第一次出現的子字符串中指定的整個字符串的指針。若子字符串不屬于母字符串的一部分,則返回空指針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); }
運行結果:
memset函數,英文全稱Fill block of memory,既填充內存塊。memset的作用是將指針指向的內存塊(這里可以認為是字符串)的第一個字節數設置為指定的值。
?演示代碼如下:
#include<string.h> int main() { char str[20]="I love you"; memset(str, '-', 2); printf("%s\n", str); return 0; }
運行結果:
顯而易見,其結果無非就是將兩個’-'填充到str字符串的前兩個位置。
讀到這里,這篇“C++中string庫函數的作用是什么和怎么使用”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。