字符串处理若干准则

看一下如下代码,存在问题么?
char test1[] = "S";
char test2[] = "Mytest!";
int nSize = min(strlen(test1),strlen(test2));
strncpy(test2,test1,nSize);
       当然了,最终结果会成为Sytest!,这当然不是我们想要的结果,不过没有办法。这样的字符串处理是不严谨的。那么需要注意一些什么?
1.字符数组如果需要copy其他字符串前,先做清空。我相信memset并不是一个很费时的操作,我甚至认为这可以忽略不计,但可以得到很多的好处。
 
2.sprintf的函数实现如下:
#ifndef _COUNT_
int __cdecl sprintf (
        char *string,
        const char *format,
        ...
        )

#else  /* _COUNT_ */

int __cdecl _snprintf (
        char *string,
        size_t count,
        const char *format,
        ...
        )

#endif  /* _COUNT_ */

{
        FILE str;
        REG1 FILE *outfile = &str;
        va_list arglist;
        REG2 int retval;
        va_start(arglist, format);
        _ASSERTE(string != NULL);
        _ASSERTE(format != NULL);
        outfile->_flag = _IOWRT|_IOSTRG;
        outfile->_ptr = outfile->_base = string;
#ifndef _COUNT_
        outfile->_cnt = MAXSTR;

#else  /* _COUNT_ */

        outfile->_cnt = count;

#endif  /* _COUNT_ */

        retval = _output(outfile,format,arglist);

        _putc_lk('/0',outfile); /* no-lock version */

        return(retval);
}
可以看出来,sprintf是一个实现非常复杂的函数。MSDN上说明Write formatted data to a string.这里面是否使用sprintf值得商榷,因为sprintf是不检查数组越界的。
 
3.在使用strncpy和snpintf之前尤其要小心,因为n的数值一般是字符串长度,那么可能后面可能没有copy ‘0’。所以这个0一定要特别关注。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值