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

發佈了50 篇原創文章 · 獲贊 13 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章