模擬實現strncpy
strncpy就是將src中的n個字符拷貝到dest中,比較簡單,但要注意幾個點:
-
如果src長度小於len該怎麼處理?
通常是用‘\0’ 補齊len的長度,注意strlen判斷src長度時,要明白strlen是向後找‘\0’來計算長度,所以,如果是用單個字符賦值,不要忘記在結尾加上‘\0’,在給src設置長度時也不要忘記算上‘\0’的長度 -
有時候還要考慮到內存重疊的問題,這裏給出了兩種方法,同樣不要忘了判斷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’補全