解析C++中的字符串處理函數(shù)和指針
C++字符串處理函數(shù)
字符串連接函數(shù) strcat
其函數(shù)原型為
strcat(char[],const char[]);
strcat是string catenate(字符串連接)的縮寫。該函數(shù)有兩個(gè)字符數(shù)組的參數(shù),函數(shù)的作用是:將第二個(gè)字符數(shù)組中的字符串連接到前面字符數(shù)組的字符串的后面。第二個(gè)字符數(shù)組被指定為const,以保證該數(shù)組中的內(nèi)容不會(huì)在函數(shù)調(diào)用期間修改。連接后的字符串放在第一個(gè)字符數(shù)組中,函數(shù)調(diào)用后得到的函數(shù)值,就是第一個(gè)字符數(shù)組的地址。例如:
char str1[30]=″People′s Republic of ″; char str2[]=″China″; cout<<strcat(str1, str2)); //調(diào)用strcat函數(shù)
輸出:
People′s Republic of China
連接前后的狀況如圖所示。
字符串復(fù)制函數(shù)strcpy
其函數(shù)原型為:
strcpy(char[], const char[]);
strcpy是string copy(字符串復(fù)制)的縮寫。它的作用是將第二個(gè)字符數(shù)組中的字符串復(fù)制到第一個(gè)字符數(shù)組中去,將第一個(gè)字符數(shù)組中的相應(yīng)字符覆蓋。例如:
char str1[10], str2[]=″China″; strcpy(str1, str2);
執(zhí)行后,str2中的5個(gè)字符″China″和′\0′(共6個(gè)字符)復(fù)制到數(shù)組str1中。
關(guān)于字符串復(fù)制函數(shù)strcpy的幾點(diǎn)說(shuō)明:
在調(diào)用strcpy函數(shù)時(shí),第一個(gè)參數(shù)必須是數(shù)組名(如str1),第二個(gè)參數(shù)可以是字符數(shù)組名,也可以是一個(gè)字符串常量。
可以用strcpy函數(shù)將一個(gè)字符串中前若干個(gè)字符復(fù)制到字符數(shù)組中去。
只能通過(guò)調(diào)用strcpy函數(shù)來(lái)實(shí)現(xiàn)將一個(gè)字符串賦給一個(gè)字符數(shù)組,而不能用賦值語(yǔ)句將一個(gè)字符串常量或字符數(shù)組直接賦給一個(gè)字符數(shù)組。
字符串比較函數(shù)strcmp
其函數(shù)原型為
strcmp(const char[],const char[]);
strcmp是string compare(字符串比較)的縮寫。作用是比較兩個(gè)字符串。由于這兩個(gè)字符數(shù)組只參加比較而不應(yīng)改變其內(nèi)容,因此兩個(gè)參數(shù)都加上const聲明。以下寫法是合法的:
strcmp(str1, str2); strcmp(″China″, ″Korea″); strcmp(str1, ″Beijing″);
比較的結(jié)果由函數(shù)值帶回:
如果字符串1=字符串2,函數(shù)值為0。
如果字符串1>字符串2,函數(shù)值為一正整數(shù)。
如果字符串1<字符串2,函數(shù)值為一負(fù)整數(shù)。
字符串比較的規(guī)則與其他語(yǔ)言中的規(guī)則相同,即對(duì)兩個(gè)字符串自左至右逐個(gè)字符相比(按ASCII碼值大小比較),直到出現(xiàn)不同的字符或遇到′\0′為止。如全部字符相同,則認(rèn)為相等;若出現(xiàn)不相同的字符,則以第一個(gè)不相同的字符的比較結(jié)果為準(zhǔn)。
注意:對(duì)兩個(gè)字符串比較,不能用以下形式:
if(str1>str2) cout<<″yes″;
字符數(shù)組名str1和str2代表數(shù)組地址,上面寫法表示將兩個(gè)數(shù)組地址進(jìn)行比較,而不是對(duì)數(shù)組中的字符串進(jìn)行比較。對(duì)兩個(gè)字符串比較應(yīng)該用
if(strcmp(str1, str2)>0) cout<<″yes″;
字符串長(zhǎng)度函數(shù)strlen
函數(shù)原型為:
strlen(const char[]);
strlen是string length(字符串長(zhǎng)度)的縮寫。它是測(cè)試字符串長(zhǎng)度的函數(shù)。其函數(shù)的值為字符串中的實(shí)際長(zhǎng)度,不包括′\0′在內(nèi)。如:
char str[10]=″China″; cout<<strlen(str);
輸出結(jié)果不是10,也不是6,而是5。
以上是幾種常用的字符串處理函數(shù),除此之外還有其他一些函數(shù)。
C++指針的概念
為了說(shuō)清楚什么是指針,必須弄清楚數(shù)據(jù)在內(nèi)存中是如何存儲(chǔ)的,又是如何讀取的。
如果在程序中定義了一個(gè)變量,在編譯時(shí)就給這個(gè)變量分配內(nèi)存單元。系統(tǒng)根據(jù)程序中定義的變量類型,分配一定長(zhǎng)度的空間。例如,C++編譯系統(tǒng)一般為整型變量分配4個(gè)字節(jié),為單精度浮點(diǎn)型變量分配4個(gè)字節(jié),為字符型變量分配1個(gè)字節(jié)。內(nèi)存區(qū)的每一個(gè)字節(jié)有一個(gè)編號(hào),這圖就是“地址”。
請(qǐng)務(wù)必弄清楚一個(gè)內(nèi)存單元的地址與內(nèi)存單元的內(nèi)容這兩個(gè)概念的區(qū)別。在程序中一般是通過(guò)變量名來(lái)對(duì)內(nèi)存單元進(jìn)行存取操作的。其實(shí)程序經(jīng)過(guò)編譯以后已經(jīng)將變量名轉(zhuǎn)換為變量的地址,對(duì)變量值的存取都是通過(guò)地址進(jìn)行的。這種按變量地址存取變量值的方式稱為直接存取方式,或直接訪問(wèn)方式。
還可以采用另一種稱為間接存取(間接訪問(wèn))的方式??梢栽诔绦蛑卸x這樣一種特殊的變量,它是專門用來(lái)存放地址的。
上圖是直接訪問(wèn)和間接訪問(wèn)的示意圖。為了將數(shù)值3送到變量中,可以有兩種方法:
直接將數(shù)3送到整型變量i所標(biāo)識(shí)的單元中。
將3送到指針變量i_pointer所指向的單元(這就是變量i所標(biāo)識(shí)的單元)中。見圖
所謂指向,就是通過(guò)地址來(lái)體現(xiàn)的。
由于通過(guò)地址能找到所需的變量單元,因此可以說(shuō),地址指向該變量單元。因此將地址形象化地稱為“指針”,一個(gè)變量的地址稱為該變量的指針。
如果有一個(gè)變量是專門用來(lái)存放另一變量地址(即指針)的,則它稱為指針變量。指針變量的值(即指針變量中存放的值)是地址(即指針)。
相關(guān)文章
C++可變參數(shù)函數(shù)的實(shí)現(xiàn)方法示例
這篇文章主要給大家介紹了關(guān)于C++可變參數(shù)函數(shù)的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12C++中基類和派生類之間的轉(zhuǎn)換實(shí)例教程
這篇文章主要介紹了C++中基類和派生類之間的轉(zhuǎn)換,有助于深入理解C++面向?qū)ο蟪绦蛟O(shè)計(jì),需要的朋友可以參考下2014-08-08C++實(shí)現(xiàn)約瑟夫環(huán)的循環(huán)單鏈表
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)約瑟夫環(huán)的循環(huán)單鏈表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10Linux下C語(yǔ)言的幾道經(jīng)典面試題小結(jié)(分享)
下面小編就為大家?guī)?lái)一篇Linux下C語(yǔ)言的幾道經(jīng)典面試題小結(jié)(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05C++實(shí)現(xiàn)LeetCode(114.將二叉樹展開成鏈表)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(114.將二叉樹展開成鏈表),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07