Strcpy和Strncpy的區別- -

第一種狀況:
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

相關文章
相關標籤/搜索