对于strncpy()函数的理解及模拟实现
这里提供一个c标准库函数的网站,可以对于相关函数进行查找,了解它的使用方法和注意事项。(但是该网站是英文的)
- strncpy()的参数和使用
可以看到通过使用strncpy()函数,能够指定字符串的拷贝
请看下面的演示代码
#include <string.h>
#include <stdio.h>
int main()
{
char string[20]= "Hel";
char* pstr = "apple";
printf("输出:%s", strncpy(string, pstr, 3));
return 0;
}
输出
可以看到输出了"apple"的前三个字符"app"
开始的string字符串是"Hel",然后将"apple"的前三个字符复制到string上去,并将"Hel"给覆盖掉了。
这里需要注意:
1.如果num传入的值大于char* source的字符长度,他会在char * destination的后面补’\0’
请看下面的两站截图的结果变化
2.如果char * destination的字符串长度小于char* source的num传入的值长度,则会造成数组越界,使程序崩坏
请看下图,结果使不能运行
这种错误一般是数组越界造成的,如果进行opencv相关的图像处理的时候,会用到大量的数组,对于经验少的人来说,没有仔细关注数组越界问题,很容易使代码不能够运行,但是没有语法报错。很难找出错误究竟出现在什么地方。
- strncpy()函数的复现
通过对于代码原理的理解进行复现,这里的 assert() 是断言函数,可以去cplusplus网站上看一看相关的作用和用法。在看strncpy()这个函数的时候,可以忽略assert()这个函数。
char* my_strncpy(char* destination,const char* src,int num)
{
assert(*destination && *src);
char* pstr = destination;
while (num--)
{
if (*src != '\0')
{
*destination = *src;
destination++, src++;
}
else
{
*destination = '\0';
destination++;
}
}
return pstr;
}
请看下面的运行结果,与库函数一样
- VS库函数中strncpy()的源代码
这是VS2013中的源代码,可以参考一下