字符串拷贝引起的bug

 真是太菜了,犯了知道、却不会在实际中灵活运用的错误

耽误了一天的时间,真是不应该

内容:从字符串中抽取出一部分来保存使用

char *check(const char *content)
{
        if(NULL == content)
        {  
                return NULL;
        }  

        const char *p_start = strstr(content, "kkkkkkkkkk");
        if(NULL == p_start)
        {  
                return NULL;
        }  
        /*根据协议前两个k是分割符*/
        p_start += 2;
        const char *p_end = p_start;
        int len = 0;

        while(*p_end != 'a' )/*以a字符结束*/
        {  
                len++;
                p_end++;
        }  
        char *bound = (char *)malloc(len + 1);
        if(NULL == bound)
        {  
                return NULL;
        }  
        memcpy(bound, p_start, len);
        return bound;
}

 

 

 

结果很让人匪夷所思,程序有时执行正确,有时执行错误,找了半天原因才发现问题

原因:没有在bound指针需要结束的地方加上'\0',导致得到的字符串结果不正常
修改:
     修改的也很sb,我第一版居然是这么修改的
   
 char *bound_end = bound;
 int count = 0;
 while(count != len)
 {  
  bound_end++;
  count++;
 }  
 *bound_end = '\0';
 这个真是太2了

比较好的修改:

 1:
        *(bound + len) = '\0';        居然这都没想到, 真是基础知识太差了
 2:
         *((char *) (bound + len)) ='\0'; 这个也可以,但和上面的区别不太清楚,谁能给解答下


 3:
        char *bound = (char *)malloc(len + 1);

 改为 char *bound = (char *)calloc(1, len + 1);/*calloc会自动为分配的内存赋值0*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值