若有一个字符数组,若要在前面插入一个字符。之前出现一个错误的用法:
#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