关于字符串常用函数strncpy strcpy strcat等(持续完善)

文章讨论了C语言中的strncpy函数可能引发的字符串溢出问题。当源字符串brr溢出时,strncpy可能会导致目标字符串arr也溢出。解决方案包括使用memset清空目标字符串,手动添加结束标志,或确保源字符串不溢出。此外,还提到了strlen用于计算字符串长度,sizeof用于获取数组大小,以及memset用于填充内存区域。
摘要由CSDN通过智能技术生成

发现 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);

strlen(C/C++语言函数)_百度百科

计算有多少个字节,不管是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]));用来清空字符串。

注意溢出问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值