strcpy strncpy sprintf

strcpy

原型:extern char *strcpy(char *dest,char *src);
用法:#include <string.h>
功能:把src所指由NULL結束的字符串複製到dest所指的數組中。
說明:src和dest所指內存區域不可以重疊且dest必須有足夠的空間來容納src的字符串。
返回指向dest的指針。

char *strcpy(char*des,const char*src)
{
    if((des==NULL)||(src==NULL))
        throw "Invalid arguments";
    char *temp=des;
    while((*des++=*src++)!='\0');
    return temp;
}
採用strcpy時要確保des的空間足夠大。


strncpy

原型:char * strncpy( char *dest, char *src, size_t num );

用法:#include <string.h>

功能:(c/c++)複製src中的內容(字符,數字、漢字....)到dest,複製多少由num的值決定,返回指向dest的指針。如果遇到null字符('\0'),且還沒有到num個字符時,就用(num - n)(n是遇到null字符前已經有的非null字符個數)個null字符附加到destination。注意:並不是添加到destination的最後,而是緊跟着由source中複製而來的字符後面。

說明:1.如果n > dest串長度,dest棧空間溢出產生崩潰異常

            2.

否則:
1)src串長度<=dest串長度,(這裏的串長度包含串尾NULL字符)
如果n<src串長度,src的前n個字符複製到dest中。但是由於沒有NULL字符,所以直接訪問dest串會發生棧溢出的異常情況。
如果n = src串長度,與strcpy一致。
如果n >src串長度,src串存放於dest字串的[0,src串長度],dest串的(src串長度, dest串長度]處存放NULL。
2)src串長度>dest串長度
如果n =dest串長度,則dest串沒有NULL字符,會導致輸出會有亂碼。如果不考慮src串複製完整性,可以將dest 最後一字符置爲NULL。


sprintf

語法: 

  #include <stdio.h>

  int sprintf( char *buffer, const char *format, ... );

sprintf()函數和printf()類似,格式控制完全一樣,只要是printf使用的格式化字符串,在sprintf都可以使用,只是把輸出發送到buffer(緩衝區)。返回值是寫入的字符數量。



功能一:格式化數字字符串 

sprintf(s, "%-8X", 12345); //s變成:“12345   

大寫的“X”代表,16進制大寫形式,寬度佔8 位置-”代表左對齊 。


功能二:控制浮點數打印格式 

浮點數使用格式符%f控制,默認保留小數點後位數字 %m.nf格式,其中表示打印的寬度,表示小數點後的位數 

sprintf(s, "%10.3f", 3.1415626); //s變成:     3.142" 


功能三:連接兩個字符串 

直接連接:

char dest[256];

char src1[] = {'a','b','c','d','e'};
char src2[] ={'1','2','3','4'};s

printf(dest,"%.5s%.4s",src1,src2); //output:abcde1234

截取字符串的某一些字符進行連接

char dest[256];

char src1[] = {'a','b','c','d','e'};
char src2[] ={'1','2','3','4'};

sprintf(dest,"%.*s%.*s",2,src1,3,src2); //output:ab123


功能四:字符/Ascii 碼對照
我們知道,使用%d或者%x打印一個字符,便能得出它的10 進制或16 進制的ASCII 碼;反過來,使用%c打印一個整數,便可以看到它所對應的ASCII 字符。以下程序段把所有可見字符的ASCII 碼對照表打印到屏幕上(這裏採用printf,注意#%X合用時自動爲16 進制數增加0X前綴):
for(int i = 32; i < 127; i++) {
    printf("[ %c ]: %3d 0x%#04X\n", i, i, i);
} 


功能五:打印地址信息 

有時調試程序時,我們可能想查看某些變量或者成員的地址,由於地址或者指針也不過是個32 位的數,你完全可以使用打印無符號整數的%u把他們打印出來:
sprintf(s, "%u", &i);
不過通常人們還是喜歡使用16 進制而不是10 進制來顯示一個地址:
sprintf(s, "%08X", &i);
然而,這些都是間接的方法,對於地址打印,sprintf 提供了專門的%p
sprintf(s, "%p", &i);
我覺得它實際上就相當於:
sprintf(s, "%0*x", 2 * sizeof(void *), &i); 


功能六:利用返回值

printfsprintf返回值是寫入的字符數量。

也就是說每當一次sprinf 調用結束以後,你無須再調用一次strlen 便已經知道了結果字符串的長度。如:
int len = sprintf(s, "%d", i); 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章