溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在C語言中實現一個字符串操作函數

發布時間:2021-03-17 15:27:50 來源:億速云 閱讀:232 作者:Leah 欄目:編程語言

怎么在C語言中實現一個字符串操作函數?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

1.strlen 

strlen是用來求字符串長度的函數,字符串長度就是它所包含的字符個數。

今天給大家介紹三種實現strlen函數的方法

(1)定義一個計數器count

//方式一:定義一個計數器
size_t my_strlen(const char *str)
{
  int count = 0;   
  while (*str)
  {
    count++;     
    str++;
  }
  return count;
}

(2)遞歸實現

size_t my_strlen(const char *str)
{
  if (*str == '\0')
    return 0;
  else
    return my_strlen(str + 1) + 1;
}

(3)利用指針-指針

size_t my_strlen(const char *str)
{
  const char *end = str;
  while (*end++)
  {
    ;
  }
  return end - str - 1;
}

2.strcpy

用于復制字符串的函數是strcpy,它的原型如下:

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

使用這個函數時,要注意幾點

(1)、目標字符數組的空間必須足夠大,足以容納需要復制的字符串
(2)、目標字符數組要可以被修改
(3)、被復制的字符串要可以找到'\0'

char *my_strcpy(char *dest, const char *src)
{
  char *tmp = dest;
  assert(dest);
  assert(src);
  while (*dest++ = *src++)
  {
    ;
  }
  return tmp;
}

3.strcat

strcat函數是可以把一個字符串添加(連接)到另一個字符串的后面。strcat函數要求dest參數原先已經包含了一個字符串(可以是空字符串)。它找到這個字符串的末尾,并把src字符串的一份拷貝添加到這個位置。

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

4.strcmp

strcmp用于比較兩個字符串,及對兩個字符串對應的字符逐個進行比較,直到發現不匹配。那個最先不匹配的字符中較“小”的那個字符所在的字符串被認為“小于”另外一個字符串。如果其中一個字符串是另外一個字符串的前面一部分,那么它也被認為“小于”另外一個字符串,因為它的'\0'出現的更早。需要注意的是,strcmp函數對于只包含大寫字母或只包含小寫字母的字符串比較。

int my_strcmp(const char *src1, const char *src2)
{
  while (*src1 == *src2)
  {
    if (*src1 == '\0')
      return 0;
    src1++;
    src2++;
  }
  return *src1 - *src2;
}

5.strstr

為了在一個字符串中查找一個子串,可以使用strstr函數,該函數實在s1中查找整個s2第1次出現的起始位置,并返回一個指向該位置的指針。如果s2并沒有出現在s1的任何地方,函數將返回一個NULL指針。如果第二個函數是一個空字符串,函數就返回s1。

char *my_strstr(const char* s1, const char* s2)
{
  const char *p = s1;
  const char *q = s2;
  const char *cur = NULL;
  assert(s1);
  assert(s2);
  if (*s2 == '\0')
    return s1;
  while (*p)
  {
    cur = p;
    while ((*p) && (*q) && (*p == *q))
    {
      p++;
      q++;
    }
    if (*q == '\0')
      return cur;
    p = cur + 1;
    q = s2;
  }
  return NULL;
}

6.strchr

strchr是用來查找一個特定的字符,在字符串str中查找字符ch第一次出現的位置,找到后函數返回一個指向該位置的指針。如果該字符并不存在于字符串中,函數就返回一個NULL指針。

char *my_strchr(char const *str, int ch)
{
  const char *tmp = str;
  while (*tmp)
  {
    if (*tmp == ch)
    {
      return tmp;
    }
    tmp++;
  }
  return NULL;
}

7.strrchr

與strchr類似的查找函數還有一個是strrchr,它和strchr的不同之處在于,該函數返回的是一個指向字符串中該字符最后一次出現的位置

char* my_strrchr(const char* str, int ch)
{
  char* pos = 0;
  assert(str);
  while (*str)
  {
    if (*str == ch)
    {
      pos = str;
    }
    str++;
  }
  if (pos != 0)
  {
    return pos;
  }
  else
    return NULL;
}

長度受限制的字符串函數

標準庫中還包含一些函數,它們以一種不同的方式去處理字符串。這些函數接受一個顯示的長度參數,用于限定進行復制或比較的字符數。

1.strncpy

和strcpy一樣,strncpy把源字符串的字符復制到目標空間,但是,它總是正好向dest中拷貝len個字符,如果strlen(src)的值小于len,dest數組就用額外的'\0'填充到len字節長度。如果strlen(src)的值大于或等于len,那么只有len個字符被復制到dest中。

char *my_strncpy(char *dest, const char *src, size_t len)
{
  char *ret = dest;
  size_t i = 0;
  assert(dest);
  assert(src);
  while (len--)
  {
    *ret++ = *src++;
  }
  if (*(ret) != '\0')
  {
    *ret = '\0';
  }
  return dest;
}

2.strncat

strncat,它從src中最多復制len個字符到目標數組的后面。

char *my_strncat(char *dst, const char *src, size_t len)
{
  char *ret = dst;
  assert(dst);
  assert(src);
  while (*dst != '\0')
  {
    dst++;
  }
  while (len--)
  {
    *dst = *src;
    dst++;
    src++;
  }
  return ret;
}

3.strncmp

strncmp也用于比較兩個字符串,但它最多比較len個字節。如果兩個字符串在第len個字符之前存在不相等的字符,這個函數就像strcmp一樣停止比較,返回結果。如果兩個字符串的前len個字符相等,函數就返回零。

int my_strncmp(char const *s1, char const *s2, size_t len)
{
  assert(s1);
  assert(s2);
  while (len--)
  {
      if (*s1 == *s2)
      {
        s1++;
        s2++;
      }
      else
      {
        return *s1 - *s2;
      }
  }
    return 0;
}

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女