发现 strncpy 函数是个大坑,提醒大家慎用(转载)
【C语言】发现 strncpy 函数是个大坑,提醒大家慎用 (amobbs.com 阿莫电子论坛 - 东莞阿莫电子网站)
strncpy
char *strncpy( char *dst, const char *src, size_t count );
我遇到的问题:char arr[5] ;char brr[8]; strncpy(arr, brr, 4);
当arr非空(包括arr[0]==0其他位有非空的情况),brr不溢出的话,是正常的,只复制4位到字符串arr。 但是brr溢出的话,arr的第五位就也会被赋值,然后arr也会溢出。
当arr为空(即所有位都是'\0'),那么不论brr是否溢出,都正常,运行完strncpy,arr[4]都是'\0',不会被溢出。
解决方式:方式一:在strncpy前面添加 memset(arr, 0, sizeof(arr)); 每次都把arr字符串清空,就正常了。
方式二:在strncpy语句后面加上arr[4] = 0; 主动给字符串添加 结束标志。
两个一起用,双重保险。
方式三:保证brr不溢出。
strlen
extern unsigned int strlen(char *s);
计算有多少个字节,不管是int还是char型,他都会从第一个字节开始找'\0',找到第一个结束符号停止,返回找到的字节数,不包括结束符号。
返回值也会是size_t,用转义符%zu接收输出。 size_t实际上是unsigned int,在VC6.0或Dev-C++中可以看到这样的代码。
%d和%zu都可以接收他的返回值。
sizeof
对于的数组元素的计算,通常 sizeof(arr)/sizeof(arr[0]) 得到元素个数
sizeof(arr)是字节数。 sizeof(arr)会计算包括的所有 字节 数,不管该元素的值是不是结束符号。不是以结束符号结束,是以数组结尾结束的。
sizeof对于其他的计算,以后在整理。
%d和%zu都可以接收他的返回值。
memset
将一个指定的字节值填充到指定的内存区域中
memset(arr,'\0',sizeof(arr)/sizeof(arr[0]));用来清空字符串。
注意溢出问题。
文章讨论了C语言中的strncpy函数可能引发的字符串溢出问题。当源字符串brr溢出时,strncpy可能会导致目标字符串arr也溢出。解决方案包括使用memset清空目标字符串,手动添加结束标志,或确保源字符串不溢出。此外,还提到了strlen用于计算字符串长度,sizeof用于获取数组大小,以及memset用于填充内存区域。
985

被折叠的 条评论
为什么被折叠?



