欧美日韩不卡一区二区三区,www.蜜臀.com,高清国产一区二区三区四区五区,欧美日韩三级视频,欧美性综合,精品国产91久久久久久,99a精品视频在线观看

C語(yǔ)言

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

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

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

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

  strcpy , strncpy, memcpy。

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

字符串操作函數(shù)

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

  1. strcpy

  strcpy函數(shù)的原型是:

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

  strcpy的實(shí)現(xiàn)經(jīng)常要注意的細(xì)節(jié)是:

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

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

  (3)要保證目標(biāo)字串的長(zhǎng)度足夠,能夠容納原串的長(zhǎng)度。

  (4)因?yàn)榭截愂莇est會(huì)移動(dòng),而最終要返回的是拷貝后字符串的起始地址,因此要先保存dest的地址,便于最終返回。

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

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

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

  strcpy的實(shí)現(xiàn)要注意的細(xì)節(jié)也基本適用于strncpy的實(shí)現(xiàn)。

  實(shí)現(xiàn)方式:

  [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的實(shí)現(xiàn)時(shí),把while(i++ < len && (*temp++ = *src++)!='\0')寫成了while( (*temp++ = *src++)!='\0' && i++ < len); 導(dǎo)致最后多復(fù)制了一個(gè)字符,明白為什么吧。。

  3. memcpy

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

  (1)strncpy只能復(fù)制字符串,但memcpy對(duì)類型沒有要求。

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

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

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

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

  4. memset

  memset函數(shù)的原型是:

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

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

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

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

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

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

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

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

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

C語(yǔ)言常用庫(kù)函數(shù)實(shí)現(xiàn)10-09

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

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

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

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

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

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