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指向了一個字符串常量,使得後面的連接操作出錯,即犯了“字符指針指向了一個串常量,然後又修改串常量的值”的錯誤。需要使用下一行的串拷貝函數替換它。
同樣,使用該函數時兩個實參所指示的內存空間避免存在重疊區域。
三、結語
正確使用這兩個函數的要點是第一個實參不能是指向一個字符串常量的字符指針,必須保證有足夠的存儲空間容納新串。另外,在文章中對程序存儲內存區域的劃分並沒有進行細緻的闡述,原因在於這部分屬於選講內容,不會影響正確理解和使用這兩個串操作函數。
-
C語言與JAVA的區別
很多人不明白C語言與C++和JAVE之間的區別,為此,為大家收集整理了下面的內容,歡迎閲讀!C語言C語言是一門通用計算機編程語言,應用廣泛。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語...
-
C語言如何提高程序效率
好的代碼沒有一個統一的衡量標準,在程序員們的世界裏大家也是各自按照自己的標準衡量着自己和別人的代碼。不過有一個標準幾乎是被所有人認同的。服役時間越長、出錯率越高的代碼就是好代碼。所有的編程方法、代碼技巧甚至於設計模式都是為了達到這個目的而產生...
-
C語言自增(++)和自減(--)
C語言源自KenThompson發明的B語言,那麼大家知道C語言自增(++)和自減(--)是什麼呢?下面一起來看看!一個整數自身加一可以這樣寫:a+=1;它等價於a=a+1;。但是在C語言中還有一種更簡單的寫法,就是a++;或者++a;。這種寫法叫做自加或自增;意思很明確,就是自身加一。相應...
-
C語言輸出菱形的方法
題目:輸出行列都相等的菱形,如5行5列:行列123451*2***3*****4***5*分析:當行數等於總行數的一半時,*是遞增的,遞增為2。當行數大於總行數的一半時,*是遞減的,遞增為2。設有一個行列為n的菱形,我們用變量i作為行數,以0開始,ik作為n菱第i行要輸出的*個數。則i<=n的中值(用m...