糯米文學吧

位置:首頁 > 計算機 > C語言

C語言中兩個串函數的使用

C語言2.68W

導語:在C語言程序設計中,字符串是一個重要的概念,針對字符串的操作函數使用頻率很高,特別是串拷貝、串連接函數,對於初學者來説很容易發生錯誤,且會感到莫名其妙。下面就由小編為大家介紹一下C語言中兩個串函數的使用,歡迎大家閲讀!

C語言中兩個串函數的使用

  一、串拷貝函數(strcpy)

strcpy俗稱“串拷貝”函數,是將一個字符串的內容拷貝到另一個字符串中,完成字符串複製功能。

strcpy函數原型如下:

char *strcpy(char *dest, char *src)[1];

從函數原型來看:兩個形式參數都是字符指針,返回值的類型也是字符指針,且值就是目標串的存儲地址。這是基本的知識。

(一)用字符數組存儲字符串

程序在VC6.0中編譯、連接沒有錯誤,但運行就會報錯,錯誤信息(關鍵信息是圖中的畫線部分)如圖1所示。

雖然可以通過調試的方式找出出錯的深層次原因,但難度較大。出錯的原因在於目標串dest(實參1)的內存空間不足以全部容納源串src(實參2)的'所有字符。因為目標串只佔用6個字節的內存空間,而源串佔用了10個字節的內存空間,串拷貝時發生了數組溢出,出現數組下標越界的情況。這就是最常見的 “緩衝區溢出”錯誤[2]。

我們在編程時沒有檢查下標,並且引用了超出數組邊界的元素而導致錯誤,要想避免這種情況就必須保證目標串佔駐的空間不小於源字符串的空間。

其中N應該是一個不小於sizeof(src)的常量。sizeof(src)與strlen(src)+1在數量上相等但意義不同,不能代換。原因在於sizeof(src)是一個運算符組織成的常量表達式,而strlen(src)+1是一個函數運算組成的表達式,兩者存在本質差別。

(二)用字符指針存儲字符串

前面的例子是用字符數組存儲字符串,而下面的例子則是用字符指針存儲字符串。

很明顯dest的內存空間足夠容納src數組中的全部字符。但是當我們在VC6.0中運行時仍會報錯(錯誤信息與圖1所示的類似),這又是為什麼呢?因為在執行語句char *dest = "12345"時,在棧中會為dest指針分配一個空間,而"12345"字符串則是存儲於文字常量區,指針變量的值就是這個串常量所在內存空間的存儲地址,而文字常量區中的數據是不能改變的,因此不能夠通過dest指針來改變字符串常量"12345"的值,一旦試圖改變文字常量區的數據則會出現錯誤。

因此,不能也不要企圖通過串拷貝的方式改變一個字符串常量的值。

修正方法是將變量dest的類型改為字符數組,即char dest[6]或者char dest[]="12345";

(三)目標指針指向不確定

因此,在進行串拷貝操作時,兩個指針所指向的內存空間應避免重疊。

對上述內容做一個總結,在使用串拷貝函數時:

第一個參數(實參)在類型上可以是字符數組,也可以是字符指針。是字符數組的話,該數組必須擁有足夠大的存儲空間(如例1);是字符指針的話,必須有確定的指向且必須擁有足夠大的存儲空間(如例3),但不能指向一個字符串常量(如例2)。

第二個參數(實參)可以是存儲字符串的字符數組、字符串常量、字符指針(該指針指向一個字符數組、或者另一字符指針、或者字符串常量)。

兩個實參在內存空間上最好不要有重疊區域(如例4)。

  二、串連接函數(strcat)

串連接函數的原型是char *strcat(char *dest,char *src)[4];功能是將兩個串dest、src連接起來組合成一個新字符串dest,並返回新串的存儲地址,這個地址仍是dest的值;用法上與串拷貝函數類似。

串連接函數的第一個實參可以是字符數組,也可以是字符指針,都必須擁有足夠的存儲空間,以便存儲連接後的新字符串。例子中被註釋掉的那條語句本身沒有錯誤,但它使得指針dest2指向了一個字符串常量,使得後面的連接操作出錯,即犯了“字符指針指向了一個串常量,然後又修改串常量的值”的錯誤。需要使用下一行的串拷貝函數替換它。

同樣,使用該函數時兩個實參所指示的內存空間避免存在重疊區域。

  三、結語

正確使用這兩個函數的要點是第一個實參不能是指向一個字符串常量的字符指針,必須保證有足夠的存儲空間容納新串。另外,在文章中對程序存儲內存區域的劃分並沒有進行細緻的闡述,原因在於這部分屬於選講內容,不會影響正確理解和使用這兩個串操作函數。

標籤:函數 語言