若有一個字符數組,若要在前面插入一個字符。之前出現一個錯誤的用法:
#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