strcpy 是C語言的函式之一,來自C語言標準函式庫,定義於string.h,它可以複製以null 為結束字元的記憶體區塊到另一個記憶體區塊內。 由於字串在C 語言不是首要的資料型態,而是以實作的方式來替代,在記憶體內以連續的位元組區塊組成,strcpy 可以有效複製兩個配置在記憶體以指標回傳的字串(字元指標或是字串指標)。
本文以C++實作執行。
strcpy和 strncpy 的 函數原型如下:
char *strcpy(char* s1,const char* s2);
char *strncpy(char* s1, const char * s2,size_t n);
strcpy中,第一個參數s1指的是要被複製到的字串,第二個參數s2指的是要被複製的字串
原文定義: Copies the string s2 into the character array s1.The value of s1 is returned.
strncpy中,第一個參數s1指的是要被複製到的字串,第二個參數s2指的是要被複製的字串,第三個參數n指的是要複製多長的字串
原文定義:Copies at most n characters of the string s2 into the character array s1. The value of s1 is returned.
strcpy和 strncpy 的實作程式碼如下:
char *strcpy(char *s1, const char *s2)
{
if ((s1 == NULL) || (s2 == NULL))
{
return NULL;
}
for (; *s2 != '\0'; s1++, s2++)
{
*s1 = *s2;
}
return s1;
}
char *strncpy(char *s1, const char*s2, int n)
{
int strCount = 0;
if ((s1 == NULL) || (s2 == NULL))
{
return NULL;
}
while (strCount<n)//((*ptr1!='\0')&&(strCount<n))
{
*s1 = *s2;
s1++;
s2++;
strCount++;
}
*s1 = '\0';//s1的第 n+1個空間 = '\0' 在這空間之後還是null
return s1;
}
完整程式碼如下:
#include <iostream>
using namespace std;
char *strcpy_implementation(char *, const char*);
char *strncpy_implementation(char *, const char *, int);
int main() {
char x1[] = "Hello";
char y[20]="";
char x2[] = "There";
char z[20];
cout << "Original string x1:" << x1 << endl;
cout << "Original string y:null"<<endl;
strcpy_implementation(y, x1);
cout << "After strcpy from x1 to y"<<endl;
cout<< "string y is:"<< y<<endl;
cout << endl;
cout << "Original string x2:" << x2 << endl;
cout << "Original string z:null." << endl;
strncpy_implementation(z, x2,3);
cout << "After strncpy from x2 to z with length 3" << endl;
cout << "string z is:" << z << endl;
system("pause");
return 0;
}
char *strcpy_implementation(char *s1, const char *s2)
{
if ((s1 == NULL) || (s2 == NULL))
{
return NULL;
}
for (; *s2 != '\0'; s1++, s2++)
{
*s1 = *s2;
}
return s1;
}
char *strncpy_implementation(char *s1, const char*s2, int n)
{
int strCount = 0;
if ((s1 == NULL) || (s2 == NULL))
{
return NULL;
}
while (strCount<n)//((*ptr1!='\0')&&(strCount<n))
{
*s1 = *s2;
s1++;
s2++;
strCount++;
}
*s1 = '\0';//s1的第 n+1個空間 = '\0' 在這空間之後還是null
return s1;
}
實際執行結果如下:
有夢最美 築夢踏實
活在當下 認真過每一天
我是阿夢 也是Ace