字串的複製 strcpy 與 strncpy 的使用與實作

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