字串的附加 strcat 與 strncat的使用與實作

strcat是C語言的函式之一,來自C語言標準函式庫,定義於string.h,它可以把第二個參數的字串附加到第一個參數之後。所以第一個參數必須保留足夠的空間作為串接時使用。

本文以C++實作執行。

strcat 和 strncat 的函數原型如下:

char *strcat(char* s1, const char* s2);

char *strncat(char* s1, const char* s2,size_t n);

strcat 中,第一個參數s1指的是要被附加在後面的字串,第二個參數s2指的是要附加的字串
原文定義: Appends the string s2 to s1. The first character of s2 overwrites the terminating null character of s1. The value of s1 is returned.

strncat 中,第一個參數s1指的是要被附加在後面的字串,第二個參數s2指的是要附加的字串,第三個參數n指的是要附加多少個s2字串中的字元到s1中
原文定義: Appends at most n characters of string s2 to string s1. The first character of s2 overwrites the terminating null character of s1. The value of s1 is returned.

 strcat 與 strncat 的實作程式碼如下: 

char *strcat_implementation(char *s1, const char *s2)
{
	char *save = s1;
	while (*save != 0)
	{
		save++;//記住s1的最後一個位置
	}
	for (; *s2 != '\0'; save++, s2++)
	{
		*save = *s2;//s1最後一個位置的下一個位置開始append s2的值
	}
	*save = '\0';//save的第1個為null的空間 = '\0' 在這空間之後還是null

	return(save);
}

char *strncat_implementation(char* s1, const char* s2, int n)
{

	char *save = s1;
	while (*save != 0)
	{
		save++;//記住s1的最後一個位置
	}
	for (int count = 0; (*s2 != '\0') && (n>count); save++, s2++, count++)
	{
		*save = *s2;//s1最後一個位置的下一個位置開始append s2的值
	}
	*save = '\0';//save的第1個為null的空間 = '\0' 在這空間之後還是null

	return(save);
}

完整程式碼如下:

#include <iostream>
using namespace std;

char *strcat_implementation(char *, const char*);
char *strncat_implementation(char *, const char*, int);

int main() {

	char s1[30] = "Hello ";
	char s2[] = "beautiful girl ";
	char s3[60]="";//如果沒有 ="" 的話 在記憶最後一個位置的時候 會記憶到 s3[59],之後附加的字串就會超過s3[60]的陣列 會噴錯誤

	cout << "s1 = " << s1 << endl;
	cout << "s2 = " << s2 << endl;
	cout << endl;

	strcat_implementation(s1, s2);

	cout << "After strcat(s1,s2):\ns1 = " << s1 << "\ns2 = " << s2<<endl;
	cout << endl;

	strncat_implementation(s3, s1,6);
	cout << "After strncat(s3,s1,6):\ns3 = " << s3 << "\ns1 = " << s1<<endl;
	cout << endl;

	strcat_implementation(s3, s1);
	cout << "After strcat(s3,s1):\ns3 = " << s3 << "\ns1 = " << s1 << endl;
	cout << endl;

	system("pause");
	return 0;
}

char *strcat_implementation(char *s1, const char *s2)
{
	while (*s1 != '\0')
	{
		s1++;//記住s1的最後一個位置
	}
	for (; *s2 != '\0'; s1++, s2++)
	{
		*s1 = *s2;//s1最後一個位置的下一個位置開始append s2的值
	}
	*s1 = '\0';//save的第1個為null的空間 = '\0' 在這空間之後還是null

	return(s1);
}

char *strncat_implementation(char* s1, const char* s2, int n)
{

	//char *save = s1;
	while (*s1 != NULL)
	{
		s1++;//記住s1的最後一個位置
	}
	for (int count = 0; (*s2 != '\0') && (n>count); s1++, s2++, count++)
	{
		*s1 = *s2;//s1最後一個位置的下一個位置開始append s2的值
	}
	*s1 = '\0';//save的第1個為null的空間 = '\0' 在這空間之後還是null

	return(s1);
}

實際執行結果如下:

有夢最美 築夢踏實

活在當下 認真過每一天

我是阿夢 也是Ace