模擬實現strncpy

模擬實現strncpy

strncpy就是將src中的n個字符拷貝到dest中,比較簡單,但要注意幾個點:

  1. 如果src長度小於len該怎麼處理?
    通常是用‘\0’ 補齊len的長度,注意strlen判斷src長度時,要明白strlen是向後找‘\0’來計算長度,所以,如果是用單個字符賦值,不要忘記在結尾加上‘\0’,在給src設置長度時也不要忘記算上‘\0’的長度

  2. 有時候還要考慮到內存重疊的問題,這裏給出了兩種方法,同樣不要忘了判斷src長度小於len的情況

代碼如下:

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <assert.h>
#include <string.h>

//不考慮內存重疊
char* MyStrncpy1(char* dest, const char* src, size_t len)
{
	assert(NULL != dest && NULL != src);

	char* ret = dest;
	int offset = 0;
	if (strlen(src) < len) //判斷源字符串長度是否小於len
	{
		offset = len - strlen(src);
		len = strlen(src);
	}

	while (len--)
	{
		*dest++ = *src++;
	}

	while (offset--) //如果源字符串長度小於len,此時需要手動用'\0'補齊len
	{
		*dest++ = '\0';
	}
	return ret;
}

//考慮內存重疊
char* MyStrncpy2(char* dest, const char* src, size_t len)
{
	assert(NULL != dest && NULL != src);

	char* ret = dest;
	char* tmp = NULL;
	int offset = 0;

	if (strlen(src) < len) //判斷源字符串長度是否小於len
	{
		offset = len - strlen(src);
		len = strlen(src);
	}

	if (dest > src && dest < src + len) //內存重疊,從後往前複製
	{
		dest = dest + len - 1;
		src = src + len - 1;
		tmp = dest; //用來記住dest的最後位置,以便源字符串長度小於len時,在後面用'\0'補全len
		while (len--)
			*dest-- = *src--;
	}
	else
	{
		while (len--)
		{
			*dest++ = *src++;
			tmp = dest;
		}
	}

	while (offset--) //如果源字符串長度小於len,此時需要手動用'\0'補齊len
	{
		*tmp++ = '\0';
	}
	return ret;
	
}

int main()
{
	char arr1[4] = "Hi!"; //注意留'\0'的空間
	char arr2[5] = {0};
	printf("%s\n", MyStrncpy1(arr2, arr1, 5));
	return 0;
}

這裏主要來測試src<len的情況,用‘\0’補全
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章