在模拟 strncpy( ) 函数之前我们先看一下它的源码声明
char *strncpy( char *strDest, const char *strSource, size_t count );
返回值是一个char * 指针,包含三个参数,一个 char * 的目标字符串,一个 const char * 的不允许改变的其内容的常量指针,和一个要拷贝字符个数的无符号整形,意思是将strSource源字符串中的前count个字符替换掉strDest目标字符串中的前count个字符。
这里有一点要注意,如果源字符串的长度小于count,则拷贝完源字符串之后,在目标字符串的后面追加0,直到conut个。
- 模拟strncpy( )函数如下
char * My_strncpy(char * dest, const char *src, size_t n)
{
assert(dest);
assert(src);
char *ret = dest;
while (n--)
{
*dest++ = *src++;
}
return ret;
}
- 测试:
char str1[20] = "123456789";
char str2[20] = "abcde";
printf("%s", My_strncpy(str1, str2, 3));// 测试1: 个数3小于字符串"abcde"的长度
char str1[20] = "123456789";
char str2[20] = "abcde";
printf("%s\n", My_strncpy(str1, str2, 6));// 测试2: 个数6等于字符串"abcde"的长度
char str1[20] = "123456789";
char str2[20] = "abcde";
printf("%s\n", My_strncpy(str1, str2, 8));// 测试3: 个数8大于字符串"abcde"的长度
代码实现(环境:Visual Studio 2017)
//1.模拟实现strncpy
#include <stdio.h>
#include <windows.h>
#include <string.h>
#include <assert.h>
#pragma warning( disable : 4996)
char * My_strncpy(char * dest, const char *src, size_t n)
{
assert(dest);
assert(src);
char *ret = dest;
while (n--)
{
*dest++ = *src++;
}
return ret;
}
int main()
{
char str1_0[20] = "123456789";
char str1_1[20] = "123456789";
char str2[20] = "abcde";
printf("调用strncpy之前: str1_0: %s \n", str1_0);
strncpy(str1_0, str2, 5); //调用系统strncpy
printf("调用strncpy之后: str1_0: %s \n", str1_0);
printf("调用My_strncpy之前: str1_1: %s \n", str1_1);
My_strncpy(str1_1, str2, 5); //调用My_strncpy
printf("调用My_strncpy之后: str1_1: %s \n", str1_1);
system("pause");
return 0;
}