发现 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]));用来清空字符串。
注意溢出问题。