溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

使用C語言怎么實(shí)現(xiàn)一個(gè)字符函數(shù)功能

發(fā)布時(shí)間:2021-02-07 18:48:48 來源:億速云 閱讀:191 作者:Leah 欄目:開發(fā)技術(shù)

本篇文章給大家分享的是有關(guān)使用C語言怎么實(shí)現(xiàn)一個(gè)字符函數(shù)功能,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

C語言字符函數(shù)、內(nèi)存函數(shù) 功能及實(shí)現(xiàn) strlen函數(shù)(求字符串長(zhǎng)度)注意點(diǎn)模擬實(shí)現(xiàn) strcpy函數(shù)(字符串拷貝函數(shù))注意點(diǎn)模擬實(shí)現(xiàn) strcat函數(shù)(字符串銜接函數(shù))注意點(diǎn)模擬實(shí)現(xiàn) strcmp函數(shù)注意點(diǎn)模擬實(shí)現(xiàn) strstr函數(shù)模擬實(shí)現(xiàn) strtok函數(shù)使用 strerror函數(shù)使用 memcpy函數(shù)注意點(diǎn)模擬實(shí)現(xiàn) memmove函數(shù)注意點(diǎn)模擬實(shí)現(xiàn) memset函數(shù)注意點(diǎn)

strlen函數(shù)(求字符串長(zhǎng)度)

統(tǒng)計(jì)字符串長(zhǎng)度直到\0為止

注意點(diǎn)

1、屬于<string.h>庫(kù)
2、參數(shù)為字符串,返回類型為無符號(hào)整型,特別注意下圖
此圖運(yùn)行結(jié)果為>,因?yàn)闊o符號(hào)整型加減必為大于0的數(shù),所以此類比較需要避免
3、結(jié)束標(biāo)志為\0

使用C語言怎么實(shí)現(xiàn)一個(gè)字符函數(shù)功能

模擬實(shí)現(xiàn)

int my_strlen(const char *str){
  assert(str);
  if(*str=='\0'){
    return 0;
  }
  return 1 + my_strlen(str + 1);//采用遞歸方式
}

strcpy函數(shù)(字符串拷貝函數(shù))

將sorc數(shù)組內(nèi)第一個(gè)\0前(包括\0)的所有內(nèi)容拷貝到dest數(shù)組。

注意點(diǎn)

1、dest數(shù)組需要足夠容納source數(shù)組
2、source數(shù)組一定要有\(zhòng)0作為中止標(biāo)識(shí)
3、dest數(shù)組要可以更改
4、\0會(huì)被拷入

模擬實(shí)現(xiàn)

char *my_strcpy(char *dest,const char *sorc)
{
  assert(dest && sorc);
  char *ret = dest;
  while (*dest++ = *sorc++)//當(dāng)/0被最后一次拷入時(shí),跳出循環(huán)
  {
    ;
  }
  return ret;
}

strcat函數(shù)(字符串銜接函數(shù))

從dest數(shù)組的第一個(gè)\0開始將sorc函數(shù)內(nèi)第一個(gè)\0前的全部?jī)?nèi)容拷貝,dest函數(shù)的第一個(gè)\0會(huì)被覆蓋,sorc函數(shù)的\0會(huì)被拷入。

注意點(diǎn)

1、dest數(shù)組要足夠容納自身和source數(shù)組
2、dest數(shù)組必須空間可修改
3、dest、source數(shù)組都有\(zhòng)0
4、不可以自己拷貝自己,因?yàn)闆]有中止條件

模擬實(shí)現(xiàn)

char *my_strcat(char *dest, const char *sorc)
{
  char *ret = dest;
  while (*dest != '\0')
  {
    dest++;
  }
  while (*dest++ = *sorc++)
  {
    ;
  }
  return ret;
}

strcmp函數(shù)

比較兩個(gè)字符串,逐位比較,若對(duì)應(yīng)位不相同則返回ASCII碼相減的值,若每一位相同(即整個(gè)字符串相同)返回0。

注意點(diǎn)

1、比較的不是長(zhǎng)度,而是對(duì)應(yīng)位置的ASCII碼值

模擬實(shí)現(xiàn)

int my_strcmp(const char *str1, const char *str2)
{
  assert(str1 && str2);
  while (*str1 == *str2)
  {
    if (*str1 == '\0' && *str2 == '\0')
    {
      return 0;
    }
    str1++;
    str2++;
  }
  return *str1 - *str2;
}

strstr函數(shù)

在母串中尋找子串,若找到則返回母串中子串的首地址,若沒找的則返回空指針

模擬實(shí)現(xiàn)

此處使用暴力方法求解,KMP算法可提供更優(yōu)解

char *my_strstr(char *mum, char *child)
{
  assert(mum && child);
  const char *pc = mum;
  while (*pc)
  {
    const char *p1 = pc;
    const char *p2 = child;
    while (*p1 == *p2 && *p1 && *p2)
    {
      p1++;
      p2++;
    }
    if (*p2 == '\0')
    {
      return (char *)pc;
    }
    pc++;
  }
  return NULL;
}

strtok函數(shù)

1、兩個(gè)參數(shù)(arr源字符串,sep符號(hào)字符串(切割標(biāo)志))
2、希望得到第二個(gè)字符串時(shí)候需要傳入空指針

使用C語言怎么實(shí)現(xiàn)一個(gè)字符函數(shù)功能

使用

int main()
{
  char arr[]="skyline&csdn.com";
  char arr2[30]={0};//因?yàn)閟trtok函數(shù)會(huì)修改源數(shù)組,通常復(fù)制后處理
  char sep[]="&.";
  strcpy(arr2,arr);
  printf("%s\n",strtok(arr2,sep));
  printf("%s\n",strtok(NULL,sep));
  printf("%s\n",strtok(NULL,sep));
  return 0;
}

結(jié)果:

使用C語言怎么實(shí)現(xiàn)一個(gè)字符函數(shù)功能

strerror函數(shù)

生成不同的錯(cuò)誤報(bào)警

使用C語言怎么實(shí)現(xiàn)一個(gè)字符函數(shù)功能

使用

int main()
{
  prinf("%s\n",strerror(errno));//根據(jù)程序出現(xiàn)的問題輸出報(bào)錯(cuò)字符串
}

memcpy函數(shù)

一個(gè)字節(jié)一個(gè)字節(jié)的拷貝,共拷貝count個(gè)字節(jié);

注意點(diǎn)

1、此函數(shù)要對(duì)兩個(gè)不相關(guān)的內(nèi)存塊(若相同由于算法限制無法)比如

int main()
{
  int num1[6] = {1, 2, 3, 4, 5, 6};
  my_memcpy(num1+2, num1, 16);//希望得到121234
                //實(shí)際得到121212
  for (int i = 0; i < 6;i++){
    printf("%d", num1[i]);
  }
  return 0;
}

模擬實(shí)現(xiàn)

void my_memcpy(void *dest, void *src, size_t count){
  assert(dest && src);
  while (count--)
    {
      *(((char *)dest)) = *(((char *)src));
      dest=(char*)dest+1;//最好不要寫成++(char*)dest,gcc編譯器認(rèn)為(char*)dest不可作為左值
      src=(char*)src+1;
    }
}

memmove函數(shù)

注意點(diǎn)

1、可以接受上文出現(xiàn)的相關(guān)內(nèi)存

模擬實(shí)現(xiàn)

void my_memmove(void *dest, void *src, size_t count)
{
  assert(dest && src);
  if (dest > src)//當(dāng)目標(biāo)位置在源位置前,我們要從后向前拷貝
  {
    while (count--)
    {
      *(((char *)dest) + count) = *(((char *)src) + count);
    }
  }
  else
  {
    while (count--)//)//當(dāng)目標(biāo)位置在源位置后,我們要從前向后拷貝
    {
      *(((char *)dest)) = *(((char *)src));
      dest=(char*)dest+1;
      src=(char*)src+1;
    }
  }
}

memset函數(shù)

將一個(gè)個(gè)字節(jié)設(shè)置為某個(gè)值,共設(shè)置count個(gè)字節(jié)

注意點(diǎn)

1、以字節(jié)為單位設(shè)置的,如果int num[10]={0},memset(num,1,40),并不能使得數(shù)組全為1,因?yàn)閕nt數(shù)組中一個(gè)元素為4個(gè)字節(jié)實(shí)際是,每個(gè)元素變成01 01 01 01,所以這是錯(cuò)誤的

以上就是使用C語言怎么實(shí)現(xiàn)一個(gè)字符函數(shù)功能,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI