- C語言字符串操作函數和的實現 推薦度:
- 相關推薦
C語言字符串操作函數及常用的實現
面試官很喜歡讓求職者寫一些常用庫函數的實現,有很多是和字符串相關的,有一些是關于內存拷貝的。一般,常會讓寫的函數有以下幾個:
strcpy , strncpy, memcpy。
memset一般不會讓去寫,但這個函數也很有特點,有很多容易用錯的地方。一并總結吧。
字符串操作函數 |
|
atof() | 將字符串轉換成浮點數 |
atoi() | 將字符串轉換成整數 |
atol() | 將字符串轉換成長整型數 |
gcvt() | 將浮點型數轉換為字符串(四舍五入) |
strtod() | 將字符串轉換成浮點數 |
strtol() | 將字符串轉換成長整型數 |
strtoul() | 將字符串轉換成無符號長整型數 |
toascii() | 將整數轉換成合法的ASCII碼字符 |
tolower() | 將大寫字母轉換為小寫字母 |
toupper() | 將小寫字母轉換為大寫字母 |
index() | 查找字符串并返回首次出現的位置 |
rindex() | 查找字符串并返回最后一次出現的位置 |
strcasecmp() | 判斷字符串是否相等(忽略大小寫) |
strcat() | 連接字符串 |
strcmp() | 根據ASCII碼比較字符串 |
strcoll() | 根據環境變量LC_COLLATE來比較字符串 |
strcpy() | 復制字符串 |
strcspn() | 查找字符串并返回首次出現的位置 |
strchr() | 查找字符串并返回首次出現該字符的地址 |
strdup() | 復制字符串 |
strlen() | 返回字符串長度 |
strncasecmp() | 比較字符串的前n個字符 |
strncat() | 拼接字符串(取前n個字符) |
strncpy() | 復制字符串(取前n個字符) |
strpbrk() | 定位字符串中第一個出現的指定字符 |
strrchr() | 定位字符串中最后出現的指定字符 |
strspn() | 返回從字符串開頭連續包含特定字符的字符數目 |
strstr() | 返回指定字符串第一次出現的地址 |
strtok() | 字符串分割 |
1. strcpy
strcpy函數的原型是:
char * strcpy(char* dest, const char* src)
strcpy的實現經常要注意的細節是:
(1)判斷地址是否為空,個人感覺可以使用斷言
(2)參數只有兩個地址,沒有拷貝的長度。拷貝到'\0‘時就會終止,要保證最終dest末尾是'\0'。
(3)要保證目標字串的長度足夠,能夠容納原串的長度。
(4)因為拷貝是dest會移動,而最終要返回的是拷貝后字符串的起始地址,因此要先保存dest的地址,便于最終返回。
在實現這一點時,有兩種方法。 char* temp=dest; 拷貝時移動dest返回temp,或者拷貝時移動temp返回dest,不知道哪個是對的。感覺兩個都是沒有問題的
其中一種實現方式:
[cpp] view plaincopychar* mystrcpy(char* dest,const char* src)
{
assert(dest!=NULL && src!=NULL);
char* temp=dest;
while((*temp++ = *src++ )!='\0')
{}
return dest;
}
2. strncpy
strncpy的功能和strcpy相似,只是它復制時多了一個終止條件。即是未遇到原串的'\0’,如果已經復制了n個字符(n為提供的參數長度),復制同樣會終止。
strcpy的實現要注意的細節也基本適用于strncpy的實現。
實現方式:
[cpp] view plaincopychar* mystrncpy(char* dest, const char* src, int len)
{
assert(dest!=NULL && src!=NULL);
char* temp=dest;
int i=0;
while(i++ < len && (*temp++ = *src++)!='\0')
{}
if(*(--temp)!='\0')
*temp='\0';
return dest;
}
[cpp] view plaincopy注意:剛開始我寫strncpy的實現時,把while(i++ < len && (*temp++ = *src++)!='\0')寫成了while( (*temp++ = *src++)!='\0' && i++ < len); 導致最后多復制了一個字符,明白為什么吧。。
3. memcpy
memcpy和strncpy有些類似,但也有本質的不同。
(1)strncpy只能復制字符串,但memcpy對類型沒有要求。
(2)strncpy有兩個終止條件,memcpy只有一個終止條件,那就是復制n個字節。(n是memcpy的第三個參數)
(3)要特別注意目的地址和源地址重合的問題,拷貝前要加以判斷。
(4)實現這個函數時一般要把原來的指針類型轉換成char*,這樣每次移動都是一個字節。
實現方式:(考慮了兩個地址空間是否會有重疊)
[cpp] view plaincopyvoid* mymemcpy(void* dest, void* src, int len)
{
int i=0;
char* tempdest=(char*)dest;
char* tempsrc=(char*)src;
if(tempdest(tempsrc+len-1))
{
while(i
{
*tempdest++ = *tempsrc++;
i++;
}
}
else
{
tempdest+=len;
tempsrc+=len;
i=len;
while(i>0)
{
*tempdest-- = *tempsrc--;
i--;
}
}
return dest;
}
注意,memcpy是對內存的拷貝,對其他安全性不做考慮。用戶在使用這個函數時要小心,比如用它來拷貝字符串(當然如果是字符串拷貝肯定是用strncpy)就要注意末尾的\0字符之類的。
4. memset
memset函數的原型是:
void *memset(void *s, int ch, size_t n)
作用是把s所指向的地址開始的n個字節的內容全部置位ch所指定的ASCII值。
一般經常用memset對某段內存空間置零。
經常會出現的一個問題:在C++中,為什么不提倡在構造函數中使用:memset(this,0,sizeof(*this))
原因: 在C++中,如果類中都是基本類型的數據成員并且沒有虛函數和虛繼承的話,使用memset這樣用到沒有太多影響。
如果有虛函數,memset會把虛表指針等全部置零,對類會產生破壞。
【C語言字符串操作函數及常用的實現】相關文章:
C語言字符串操作函數和常用的實現10-16
C語言中返回字符串函數的實現方法09-19
C語言常用庫函數實現10-09
C語言字符串操作09-12
C語言實現返回字符串函數的方法有哪些07-10
C語言字符串處理函數10-09
C語言文件操作函數10-18
C語言字符串操作講解08-03
C 語言中返回字符串函數的四種實現方法09-18