字符串函数剖析
strcpy能把strSrc的內(nèi)容復(fù)制到strDest,為什么還要char * 類型的返回值?
為了實(shí)現(xiàn)鏈?zhǔn)奖磉_(dá)式:int length = strlen( strcpy( strDest, “hello world”) );
2. strncpy()
功能:把src所指由NULL結(jié)束的字符串的前n個字節(jié)復(fù)制到dest所指的數(shù)組中。
說明:1. 如果src的前n個字節(jié)不含NULL字符,則結(jié)果不會以NULL字符結(jié)束。
2. 如果src的長度小于n個字節(jié),則以NULL填充dest直到復(fù)制完n個字節(jié)。
3. src和dest所指內(nèi)存區(qū)域不可以重疊且dest必須有足夠的空間來容納src的字符串。
返回值:返回指向dest的指針。
對strncpy()函數(shù)來說,它意味著只能使用“n”個字符的空間,包括末尾的NUL字符。strncpy()函數(shù)也恰好只拷貝“n”個字符。如果第二個參數(shù)沒有這么多字符,strncpy()函數(shù)會用NUL字符填充剩余的空間。如果第二個參數(shù)有多于“n”個的字符,那么strncpy()函數(shù)在還沒有拷貝到NUL字符之前就結(jié)束工作了。這意味著,在使用strncpy()函數(shù)時,你應(yīng)該總是自己在目標(biāo)字符串的末尾加上NUL字符,而不要指望strncpy()函數(shù)為你做這項(xiàng)工作。
對strncat()函數(shù)來說,它意味著最多只能拷貝“n”個字符,如果需要還要加上一個NUL字符。因?yàn)槟阏嬲赖氖悄繕?biāo)字符串能存放多少個字符,所以通常你要用strlen()函數(shù)來計(jì)算可以拷貝的字符數(shù)。
函數(shù)strncpy()和strncat()之間的區(qū)別是“歷史性”的(這是一個技術(shù)用語,指的是“它對某些人確實(shí)起到了一定的作用,并且它可能是處理問題的正確途徑,但為什么正確至今仍然說不清楚”)。
1 char *strncpy(char * dest, const char * source, size_t count) 2 { 3 char *start = dest; 4 while (count && (*dest++ = *source++)) 5 { 6 count--; 7 } 8 if (count) 9 { 10 while (--count) 11 { 12 *dest++ = '\0'; 13 } 14 } 15 return(start); 16 }對于strcpy和strncpy的區(qū)別?
(1): strncpy 從某種意義上說是安全的。只要n的長度不超過s1分配的實(shí)際長度,就不會造成內(nèi)存越界。
(2): 如果n不超過s1的長度,strncpy會在s1的尾部自動添加null字符。
memcpy()
功能:從源src所指的內(nèi)存地址的起始位置開始拷貝n個字節(jié)到目標(biāo)dest所指的內(nèi)存地址的起始位置中。
說明:
(1):source和dest所指內(nèi)存區(qū)域不能重疊。
(2):如果目標(biāo)數(shù)組本身已有數(shù)據(jù),執(zhí)行memcpy()后,將覆蓋原有數(shù)據(jù)(最多覆蓋n)。如果要追加數(shù)據(jù),則每次執(zhí)行memcpy后,要將目標(biāo)數(shù)組地址增加到你要追加數(shù)據(jù)的地址。
(3):source和dest都不一定是數(shù)組,任意的可讀寫的空間均可
返回值:返回指向dest的指針。
對于memcpy和strcpy的區(qū)別?
(1): 復(fù)制的內(nèi)容不同。strcpy只能復(fù)制字符串,而memcpy可以復(fù)制任意內(nèi)容,例如字符數(shù)組、整型、結(jié)構(gòu)體、類等。
(2):復(fù)制的方法不同。strcpy不需要指定長度,它遇到被復(fù)制字符的串結(jié)束符”\0”才結(jié)束,所以容易溢出。memcpy則是根據(jù)其第3個參數(shù)決定復(fù)制的長度。
(3):用途不同。通常在復(fù)制字符串時用strcpy,而需要復(fù)制其他類型數(shù)據(jù)時則一般用memcpy。
5.streql(), 判斷兩個字符串是否相等.
int streql(char *str1,char *str2) { while((*str1==*str2)&&(*str1)) { str1++; str2++; } return((*str1==NULL)&&(*str2==NULL)); }6.strchr(), 在字符串中查找某個字符.
char *strchr(const char *string,int letter) { while((*string!=letter)&(*string)) string++; return (string); }8.strcmp(), 判斷兩個字符串是否相等.
int strcmp(const char *str1,const char *str2) { while((*str1==*str2)&&(*str1)) { str1++; str2++; } if((*str1==*str2)&&(!*str1)) //Same strings return o; else if((*str1)&&(!*str2)) //Same but str1 longer return -1; else if((*str2)&&(!*str1)) //Same but str2 longer else return((*str1>*str2)?-1:1); }總結(jié)
- 上一篇: 排列若干个字符串,判断是否首尾可以连接在
- 下一篇: string字符串详解