- 相關(guān)推薦
C語言中兩個(gè)串函數(shù)的使用
導(dǎo)語:在C語言程序設(shè)計(jì)中,字符串是一個(gè)重要的概念,針對(duì)字符串的操作函數(shù)使用頻率很高,特別是串拷貝、串連接函數(shù),對(duì)于初學(xué)者來說很容易發(fā)生錯(cuò)誤,且會(huì)感到莫名其妙。下面就由小編為大家介紹一下C語言中兩個(gè)串函數(shù)的使用,歡迎大家閱讀!
一、串拷貝函數(shù)(strcpy)
strcpy俗稱“串拷貝”函數(shù),是將一個(gè)字符串的內(nèi)容拷貝到另一個(gè)字符串中,完成字符串復(fù)制功能。
strcpy函數(shù)原型如下:
char *strcpy(char *dest, char *src)[1];
從函數(shù)原型來看:兩個(gè)形式參數(shù)都是字符指針,返回值的類型也是字符指針,且值就是目標(biāo)串的存儲(chǔ)地址。這是基本的知識(shí)。
(一)用字符數(shù)組存儲(chǔ)字符串
程序在VC6.0中編譯、連接沒有錯(cuò)誤,但運(yùn)行就會(huì)報(bào)錯(cuò),錯(cuò)誤信息(關(guān)鍵信息是圖中的畫線部分)如圖1所示。
雖然可以通過調(diào)試的方式找出出錯(cuò)的深層次原因,但難度較大。出錯(cuò)的原因在于目標(biāo)串dest(實(shí)參1)的內(nèi)存空間不足以全部容納源串src(實(shí)參2)的所有字符。因?yàn)槟繕?biāo)串只占用6個(gè)字節(jié)的內(nèi)存空間,而源串占用了10個(gè)字節(jié)的內(nèi)存空間,串拷貝時(shí)發(fā)生了數(shù)組溢出,出現(xiàn)數(shù)組下標(biāo)越界的情況。這就是最常見的 “緩沖區(qū)溢出”錯(cuò)誤[2]。
我們?cè)诰幊虝r(shí)沒有檢查下標(biāo),并且引用了超出數(shù)組邊界的元素而導(dǎo)致錯(cuò)誤,要想避免這種情況就必須保證目標(biāo)串占駐的空間不小于源字符串的空間。
其中N應(yīng)該是一個(gè)不小于sizeof(src)的常量。sizeof(src)與strlen(src)+1在數(shù)量上相等但意義不同,不能代換。原因在于sizeof(src)是一個(gè)運(yùn)算符組織成的常量表達(dá)式,而strlen(src)+1是一個(gè)函數(shù)運(yùn)算組成的表達(dá)式,兩者存在本質(zhì)差別。
(二)用字符指針存儲(chǔ)字符串
前面的例子是用字符數(shù)組存儲(chǔ)字符串,而下面的例子則是用字符指針存儲(chǔ)字符串。
很明顯dest的內(nèi)存空間足夠容納src數(shù)組中的全部字符。但是當(dāng)我們?cè)赩C6.0中運(yùn)行時(shí)仍會(huì)報(bào)錯(cuò)(錯(cuò)誤信息與圖1所示的類似),這又是為什么呢?因?yàn)樵趫?zhí)行語句char *dest = "12345"時(shí),在棧中會(huì)為dest指針分配一個(gè)空間,而"12345"字符串則是存儲(chǔ)于文字常量區(qū),指針變量的值就是這個(gè)串常量所在內(nèi)存空間的存儲(chǔ)地址,而文字常量區(qū)中的數(shù)據(jù)是不能改變的,因此不能夠通過dest指針來改變字符串常量"12345"的值,一旦試圖改變文字常量區(qū)的數(shù)據(jù)則會(huì)出現(xiàn)錯(cuò)誤。
因此,不能也不要企圖通過串拷貝的方式改變一個(gè)字符串常量的值。
修正方法是將變量dest的類型改為字符數(shù)組,即char dest[6]或者char dest[]="12345";
(三)目標(biāo)指針指向不確定
因此,在進(jìn)行串拷貝操作時(shí),兩個(gè)指針?biāo)赶虻膬?nèi)存空間應(yīng)避免重疊。
對(duì)上述內(nèi)容做一個(gè)總結(jié),在使用串拷貝函數(shù)時(shí):
第一個(gè)參數(shù)(實(shí)參)在類型上可以是字符數(shù)組,也可以是字符指針。是字符數(shù)組的話,該數(shù)組必須擁有足夠大的存儲(chǔ)空間(如例1);是字符指針的話,必須有確定的指向且必須擁有足夠大的存儲(chǔ)空間(如例3),但不能指向一個(gè)字符串常量(如例2)。
第二個(gè)參數(shù)(實(shí)參)可以是存儲(chǔ)字符串的字符數(shù)組、字符串常量、字符指針(該指針指向一個(gè)字符數(shù)組、或者另一字符指針、或者字符串常量)。
兩個(gè)實(shí)參在內(nèi)存空間上最好不要有重疊區(qū)域(如例4)。
二、串連接函數(shù)(strcat)
串連接函數(shù)的原型是char *strcat(char *dest,char *src)[4];功能是將兩個(gè)串dest、src連接起來組合成一個(gè)新字符串dest,并返回新串的存儲(chǔ)地址,這個(gè)地址仍是dest的值;用法上與串拷貝函數(shù)類似。
串連接函數(shù)的第一個(gè)實(shí)參可以是字符數(shù)組,也可以是字符指針,都必須擁有足夠的存儲(chǔ)空間,以便存儲(chǔ)連接后的新字符串。例子中被注釋掉的那條語句本身沒有錯(cuò)誤,但它使得指針dest2指向了一個(gè)字符串常量,使得后面的連接操作出錯(cuò),即犯了“字符指針指向了一個(gè)串常量,然后又修改串常量的值”的錯(cuò)誤。需要使用下一行的串拷貝函數(shù)替換它。
同樣,使用該函數(shù)時(shí)兩個(gè)實(shí)參所指示的內(nèi)存空間避免存在重疊區(qū)域。
三、結(jié)語
正確使用這兩個(gè)函數(shù)的要點(diǎn)是第一個(gè)實(shí)參不能是指向一個(gè)字符串常量的字符指針,必須保證有足夠的存儲(chǔ)空間容納新串。另外,在文章中對(duì)程序存儲(chǔ)內(nèi)存區(qū)域的劃分并沒有進(jìn)行細(xì)致的闡述,原因在于這部分屬于選講內(nèi)容,不會(huì)影響正確理解和使用這兩個(gè)串操作函數(shù)。
【C語言中兩個(gè)串函數(shù)的使用】相關(guān)文章:
c語言中有關(guān)隨機(jī)函數(shù)的使用詳解07-23
C語言中返回字符串函數(shù)的實(shí)現(xiàn)方法03-22
C語言中函數(shù)的區(qū)分04-10
C語言中字符串常用函數(shù)strcat與strcpy的用法03-13
C語言中關(guān)于時(shí)間的函數(shù)02-19
c語言中time函數(shù)的用法05-15