第一種狀況:
char* p="how are you ?";
char name[20]="ABCDEFGHIJKLMNOPQRS";
strcpy(name,p); //name改變爲"how are you ? OPQRS " ====>錯誤!
strncpy(name,p,sizeof(name)) //name改變爲"how are you ? " ====>正確!
第二種狀況:
char* p="how are you ?";
char name[20];
strcpy(name,p); //name改變爲"how are you ? 未知字符 " ====>錯誤!
name[sizeof(name)-1]='\0' //和上一步組合,獲得正確的結果!
strncpy(name,p,sizeof(name)); //name改變爲"how are you ? " ====>正確!
第三種狀況:
char* p="how are you ?";
char name[10];
strcpy(name,p); //name改變爲"how are yo" ====>無結束符'\0',錯誤!
name[sizeof(name)-1]='\0' //和上一步組合,彌補結果。但要注意,字符傳遞錯誤!
strncpy(name,p,sizeof(name)); //和單純的一步strcpy結果同樣!
================================================
總結:strcpy
若是源長>目標長,則將源長中等於目標長的字符拷貝到目標字符串
若是源長<目標長,則源長所有拷貝到目標字符串,不包括'\0'
strncpy
若是目標長>指定長>源長,則將源長所有拷貝到目標長,自動加上'\0'
若是指定長<源長,則將源長中按指定長度拷貝到目標字符串,不包括'\0'
若是指定長>目標長,error happen!ios
關鍵字: Strcpy,Strncpyc++
Strcpy的函數原型:app
char *strcpy(char *dst, const char *src)函數
函數功能:spa
將字符串src拷貝到字符串dst中去。內存
用法解析:資源
在執行字符串拷貝以前,「用戶須要保證」dst指向的空間足夠大。不然的話,可能會產生意想不到的後果。字符串
若是dst所指向的空間不足以存儲src中的字符串的話,不要覺得只是遺失了src中存儲不下的字符串這麼簡單。get
在VC的庫函數中,strcpy()的定義以下:原型
char * __cdecl strcpy(char * dst, const char * src)
{
char * cp = dst;
while( *cp++ = *src++ )
; /* Copy src over dst */ /*注意這行有個分號*/
return( dst );
}
須要留意的是,這個函數定義中的循環語句:
while( *cp++ = *src++ )
;
這個循環會一直執行,直到循環條件爲0。注意這裏的0不是數字裏的零,而是ASCII碼中的0。也就是’\0’ 。
也就是說,若是dst所指向的存儲空間不夠大的話,這個函數會將src中的部份內容拷貝到dst所指內存空間後面的內存中。而dst所指空間後面的內存倒是不可知的,有可能已經被其它資源佔用了,這樣就會破壞掉原先存儲的內容,致使系統崩潰。
由於strcpy在執行字符串拷貝的時候,會從src所指位置開始,檢測當前內存單元中存儲的數據是否爲‘\0’。若是不爲‘\0’,則將這個內存單元中的數據拷貝到dst所指向的內存中。若是src中存儲的字符串長度大於dst所申請的內存空間的話,就會產生越界,形成不可預知的後果。
Strncpy的函數原型:
char *strncpy(char *dest, const char *src,int count)
函數功能:
將字符串src中的count個字符拷貝到字符串dest中去。
用法解析:
這個函數和strcpy相似,當src的長度大於dst申請的空間的時候,狀況和strcpy同樣;
若是第3個參數count的值大於src中字符串的長度的話,就會將字符串src拷貝到dst中,返回函數。
示例程序:
#include <iostream>
// #include <conio.h> // for getch()
#include <string.h> // for stycpy()
using namespace std;
int main()
{
int i = 0;
char dst[11] = "1234567890";
char src[15] = {'1','2','3','4','5','\0','7','8','9','0','1','2','3','4'};
strcpy( dst, src );
cout<<"strcpy()"<<endl;
cout<<dst<<endl<<endl;
strncpy( dst, src, 14 ); // cont = 14
cout<<"strncpy()"<<endl;
cout<<dst<<endl<<endl;
// getch();
return 0;
}
程序執行結果:
strcpy()
12345
strncpy()
12345