sprintf的一点问题

sprintf使用参数 %s 时,是把字符串放到指定的缓冲区,字符串要以“/0”结尾,否则会导致不可预料的行为。

如这些:
    char name[20];
    char temp1[5] = "abcde"; 
    memset(name,0,sizeof(name));
    sprintf(name,"%s ",temp1);

name里面可能是“abcde”,也可能是“abcde”后面跟着乱码。原因是temp1字符数组里面没有“/0”来结尾,然后指针不停加,就随便指到一块内存,再把内存里的内容拷贝到name里面去,有可能这个内存里面是“/0”,也有可能是乱七八糟的东西。这个问题值得注意啊。

把char temp1[5] = "abcde" 改成char *temp1 = "abcde" 要好些,指针的方式会自动在后面加“/0”,char temp[] = "abcde"不会在后面加“/0”。

sprintf(name,"%s","abcd")(第三个参数是常量时)会自动把“abcde”放到name里面后,在后面加“/0”。

printf也有一样的问题。

 

以上在Slickedit加gcc环境下测试。如果在vs .net 2005里面,char *temp1 = "abcde" 不会显示后面有“/0”。在se里面会temp1显示为数组,后面有“/0”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值