从这篇文章可以看出有些错误,由此可以看出,还是看msdn要好的多,这是我的经验
建議大家多看msdn,下面的有的函數說明有的地方有錯誤,不管是誰寫的,都不能保證沒有錯誤,需要提醒大家,在看書的時候要保持懷疑的態度,兼容并包,要親手試試,才能將書本的知識轉化為自己的東西。
strcpy與strncpy函數
(1) Memset
原型:extern void *memset(void *buffer, int c, int count);
用法:#include <string.h>
功能:把buffer所指內存區域的前count個字節設置成字符c。
說明:返回指向buffer的指針。用來對一段內存空間全部設置為某個字符
例:char a[10];memset(a, '/0', sizeof(a));
memset可以方便的清空一個結構類型的變量或數組。
如:
struct _test
{
char s[10];
int x;
int y;
};
變量
struct _test?? st;
(1)一般清空st的方法如下:
st.s[0] = '/0';
st.x???? = 0;
st.y????? = 0;
(2) 用memset方法如下:
memset(&st,0,sizeof(struct _test));
數組:
struct _test?? st[10];
則用??? memset(st,0,sizeof(struct _test)*10);
(2)memcpy
原型:extern void *memcpy(void *dest, void *src, unsigned int count);
用法:#include <string.h>
功能:由src所指內存區域復制count個字節到dest所指內存區域。
說明:src和dest所指內存區域不能重疊,函數返回指向dest的指針。
可以拿它拷貝任何數據類型的對象。
例:char a[10],b[5];
memcpy(b, a, sizeof(b));
/*注意如果用sizeof(a),會造成b的內存地址溢出*/
(3) Strcpy??
原型:extern char *strcpy(char *dest,char *src);
用法:#include <string.h>
功能:把src所指由NULL結束的字符串復制到dest所指的數組中。
說明:src和dest所指內存區域不可以重疊且dest必須有足夠的空間來容納src的字符串。返回指向dest的指針。
????? 例:char a[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字符串長度(第一個‘/0’之前)是否超過50位,如超過,則會造成b的內存地址溢出
(4) 三者區別??
memset?? 主要應用是初始化某個內存空間。
memcpy?? 是用于copy源空間的數據到目的空間中。
strcpy?????? 用于字符串copy,遇到‘/0’,將結束。
如果理解了這些,就能知道它們的區別:
例如初始化某塊空間的時候,用到memcpy,那么就顯得很笨拙了。
int m[100]
memset((void*)m,0x00,sizeof(int)*100);?????????? //Ok!
memcpy((void*)m,"/0/0/0/0....",sizeof(int)*100); //Not Ok!
?
Strcpy和Strncpy的區別- -
第一種情況:
char* p="how are you ?";
char name[20]="ABCDEFGHIJKLMNOPQRS";
strcpy(name,p); //name改變為"how are you ? OPQRS " ====>錯誤!
strncpy(name,p,sizeof(name)) //name改變為"how are you ? " ====>正確!
第二種情況:
char* p="how are you ?";
char name[20];
strcpy(name,p); //name改變為"how are you ? 未知字符 " ====>錯誤!
name[sizeof(name)-1]='/0' //和上一步組合,得到正確的結果!
strncpy(name,p,sizeof(name)); //name改變為"how are you ? " ====>正確!
第三種情況:
char* p="how are you ?";
char name[10];
strcpy(name,p); //name改變為"how are yo" ====>無結束符'/0',錯誤!
name[sizeof(name)-1]='/0' //和上一步組合,彌補結果。但要注意,字符傳遞錯誤!
strncpy(name,p,sizeof(name)); //和單純的一步strcpy結果一樣!
================================================
總結:strcpy
如果源長>目標長,則將源長中等于目標長的字符拷貝到目標字符串
如果源長<目標長,則源長全部拷貝到目標字符串,不包括'/0'
strncpy
如果目標長>指定長>源長,則將源長全部拷貝到目標長,自動加上'/0'
如果指定長<源長,則將源長中按指定長度拷貝到目標字符串,不包括'/0'
如果指定長>目標長,error happen!
strncpy(sptsf_cert.recv_inst,clr_total.payint_acc,4);//拷貝前四位 為了您的安全,請只打開來源可靠的網址
打開網站????取消
來自: http://hi.baidu.com/wenleiworld/blog/item/175e072ad002aef0e6cd4033.html總結
以上是生活随笔為你收集整理的从这篇文章可以看出有些错误,由此可以看出,还是看msdn要好的多,这是我的经验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 这是我转贴的strcpy函数与strnc
- 下一篇: ANSI C标准函数库