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