一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看

C語(yǔ)言

C語(yǔ)言字符串操作函數及常用的實(shí)現

時(shí)間:2025-03-16 16:59:30 C語(yǔ)言 我要投稿

C語(yǔ)言字符串操作函數及常用的實(shí)現

  面試官很喜歡讓求職者寫(xiě)一些常用庫函數的實(shí)現,有很多是和字符串相關(guān)的,有一些是關(guān)于內存拷貝的。一般,常會(huì )讓寫(xiě)的函數有以下幾個(gè):

  strcpy , strncpy, memcpy。

  memset一般不會(huì )讓去寫(xiě),但這個(gè)函數也很有特點(diǎn),有很多容易用錯的地方。一并總結吧。

字符串操作函數

 
atof() 將字符串轉換成浮點(diǎn)數
atoi() 將字符串轉換成整數
atol() 將字符串轉換成長(cháng)整型數
gcvt() 將浮點(diǎn)型數轉換為字符串(四舍五入)
strtod() 將字符串轉換成浮點(diǎn)數
strtol() 將字符串轉換成長(cháng)整型數
strtoul() 將字符串轉換成無(wú)符號長(cháng)整型數
toascii() 將整數轉換成合法的ASCII碼字符
tolower() 將大寫(xiě)字母轉換為小寫(xiě)字母
toupper() 將小寫(xiě)字母轉換為大寫(xiě)字母
index() 查找字符串并返回首次出現的位置
rindex() 查找字符串并返回最后一次出現的位置
strcasecmp() 判斷字符串是否相等(忽略大小寫(xiě))
strcat() 連接字符串
strcmp() 根據ASCII碼比較字符串
strcoll() 根據環(huán)境變量LC_COLLATE來(lái)比較字符串
strcpy() 復制字符串
strcspn() 查找字符串并返回首次出現的位置
strchr() 查找字符串并返回首次出現該字符的地址
strdup() 復制字符串
strlen() 返回字符串長(cháng)度
strncasecmp() 比較字符串的前n個(gè)字符
strncat() 拼接字符串(取前n個(gè)字符)
strncpy() 復制字符串(取前n個(gè)字符)
strpbrk() 定位字符串中第一個(gè)出現的指定字符
strrchr() 定位字符串中最后出現的指定字符
strspn() 返回從字符串開(kāi)頭連續包含特定字符的字符數目
strstr() 返回指定字符串第一次出現的地址
strtok() 字符串分割
 

  1. strcpy

  strcpy函數的原型是:

  char * strcpy(char* dest, const char* src)

  strcpy的實(shí)現經(jīng)常要注意的細節是:

  (1)判斷地址是否為空,個(gè)人感覺(jué)可以使用斷言

  (2)參數只有兩個(gè)地址,沒(méi)有拷貝的長(cháng)度?截惖'\0‘時(shí)就會(huì )終止,要保證最終dest末尾是'\0'。

  (3)要保證目標字串的長(cháng)度足夠,能夠容納原串的長(cháng)度。

  (4)因為拷貝是dest會(huì )移動(dòng),而最終要返回的是拷貝后字符串的起始地址,因此要先保存dest的地址,便于最終返回。

  在實(shí)現這一點(diǎn)時(shí),有兩種方法。 char* temp=dest; 拷貝時(shí)移動(dòng)dest返回temp,或者拷貝時(shí)移動(dòng)temp返回dest,不知道哪個(gè)是對的。感覺(jué)兩個(gè)都是沒(méi)有問(wèn)題的

  其中一種實(shí)現方式:

  [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相似,只是它復制時(shí)多了一個(gè)終止條件。即是未遇到原串的'\0’,如果已經(jīng)復制了n個(gè)字符(n為提供的參數長(cháng)度),復制同樣會(huì )終止。

  strcpy的實(shí)現要注意的細節也基本適用于strncpy的實(shí)現。

  實(shí)現方式:

  [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注意:剛開(kāi)始我寫(xiě)strncpy的實(shí)現時(shí),把while(i++ < len && (*temp++ = *src++)!='\0')寫(xiě)成了while( (*temp++ = *src++)!='\0' && i++ < len); 導致最后多復制了一個(gè)字符,明白為什么吧。。

  3. memcpy

  memcpy和strncpy有些類(lèi)似,但也有本質(zhì)的不同。

  (1)strncpy只能復制字符串,但memcpy對類(lèi)型沒(méi)有要求。

  (2)strncpy有兩個(gè)終止條件,memcpy只有一個(gè)終止條件,那就是復制n個(gè)字節。(n是memcpy的第三個(gè)參數)

  (3)要特別注意目的地址和源地址重合的問(wèn)題,拷貝前要加以判斷。

  (4)實(shí)現這個(gè)函數時(shí)一般要把原來(lái)的指針類(lèi)型轉換成char*,這樣每次移動(dòng)都是一個(gè)字節。

  實(shí)現方式:(考慮了兩個(gè)地址空間是否會(huì )有重疊)

  [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是對內存的拷貝,對其他安全性不做考慮。用戶(hù)在使用這個(gè)函數時(shí)要小心,比如用它來(lái)拷貝字符串(當然如果是字符串拷貝肯定是用strncpy)就要注意末尾的\0字符之類(lèi)的。

  4. memset

  memset函數的原型是:

  void *memset(void *s, int ch, size_t n)

  作用是把s所指向的地址開(kāi)始的n個(gè)字節的內容全部置位ch所指定的ASCII值。

  一般經(jīng)常用memset對某段內存空間置零。

  經(jīng)常會(huì )出現的一個(gè)問(wèn)題:在C++中,為什么不提倡在構造函數中使用:memset(this,0,sizeof(*this))

  原因: 在C++中,如果類(lèi)中都是基本類(lèi)型的數據成員并且沒(méi)有虛函數和虛繼承的話(huà),使用memset這樣用到?jīng)]有太多影響。

  如果有虛函數,memset會(huì )把虛表指針等全部置零,對類(lèi)會(huì )產(chǎn)生破壞。

【C語(yǔ)言字符串操作函數及常用的實(shí)現】相關(guān)文章:

C語(yǔ)言字符串操作函數和常用的實(shí)現10-16

C語(yǔ)言中返回字符串函數的實(shí)現方法09-19

C語(yǔ)言常用庫函數實(shí)現10-09

C語(yǔ)言字符串操作09-12

C語(yǔ)言實(shí)現返回字符串函數的方法有哪些07-10

C語(yǔ)言字符串處理函數10-09

C語(yǔ)言文件操作函數10-18

C語(yǔ)言字符串操作講解08-03

C 語(yǔ)言中返回字符串函數的四種實(shí)現方法09-18

一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看