sprintf的一个注意点

若有一个字符数组,若要在前面插入一个字符。之前出现一个错误的用法:

#include "stdio.h"
void main()
{/*在buf前面插入字符1*/
	int dest;	char buf[12]="223";		
	sprintf(buf,"1%s",buf);
	printf("buf=%s\n",buf);    
}


长度是增加了一,但都变成了前面的字符1了。

这个错误的根源是sprintf中的物理地址发生了重迭,这里是完全重迭。发生重迭的数组处理时,大多数会无法正常工作。例如,如果目标数组的头与源数组的尾在物理地址上重迭,那么源数组中的一部分内容就会在复制之前被覆盖。甚至可能出现使得标识字符串结束的空字符丢失,而使拷贝无休止地无意义地进行着。

这里在先把1写入到buf,中,从而改变原始数组的buf.从而原始数据的第1个字符变成了1.而原始的第一字符把它写到目标字符的第二个字符,就使第二个字符也变成了1。从而双把第二个1,写到目标字符的第三个字符,又为1....如此一直重复,重复次数为原始buf的长度。并在最后加上一个NULL.

从而需要采用临时变量的方式

void main()
{/*在buf前面插入字符1*/
	int dest;	char buf[12]="223";	
	char temp[12];
	printf("by csdn:lin20073\n");	
	sprintf(temp,"1%s",buf);
	strncpy(buf,temp,strlen(temp)+1);
	printf("buf=%s\n",buf);    
}

载请标明出处:http://blog.csdn.net/lin200753/article/details/28733225

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值