C語言實現(xiàn)字符串操作函數(shù)的實例
C語言實現(xiàn)字符串操作函數(shù)的實例
在編寫程序的過程中,我們經(jīng)常使用到一些字符串函數(shù),例如求字符串長度,拷貝字符串……,這些函數(shù)都在C標(biāo)準(zhǔn)庫中存在,我們可以直接使用。但我們還需要掌握這些函數(shù)的實現(xiàn)方法,今天來看看一些常用的字符串操作函數(shù)的實現(xiàn)方法。 
1.strlen 
strlen是用來求字符串長度的函數(shù),字符串長度就是它所包含的字符個數(shù)。 
今天給大家介紹三種實現(xiàn)strlen函數(shù)的方法 
(1)定義一個計數(shù)器count
//方式一:定義一個計數(shù)器
size_t my_strlen(const char *str)
{
  int count = 0;   
  while (*str)
  {
    count++;     
    str++;
  }
  return count;
}
(2)遞歸實現(xiàn)
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 
用于復(fù)制字符串的函數(shù)是strcpy,它的原型如下:
char *strcpy(char *dest, const char *src);
使用這個函數(shù)時,要注意幾點 
(1)、目標(biāo)字符數(shù)組的空間必須足夠大,足以容納需要復(fù)制的字符串 
(2)、目標(biāo)字符數(shù)組要可以被修改 
(3)、被復(fù)制的字符串要可以找到'\0'
char *my_strcpy(char *dest, const char *src)
{
  char *tmp = dest;
  assert(dest);
  assert(src);
  while (*dest++ = *src++)
  {
    ;
  }
  return tmp;
}
3.strcat 
strcat函數(shù)是可以把一個字符串添加(連接)到另一個字符串的后面。strcat函數(shù)要求dest參數(shù)原先已經(jīng)包含了一個字符串(可以是空字符串)。它找到這個字符串的末尾,并把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用于比較兩個字符串,及對兩個字符串對應(yīng)的字符逐個進(jìn)行比較,直到發(fā)現(xiàn)不匹配。那個最先不匹配的字符中較“小”的那個字符所在的字符串被認(rèn)為“小于”另外一個字符串。如果其中一個字符串是另外一個字符串的前面一部分,那么它也被認(rèn)為“小于”另外一個字符串,因為它的'\0'出現(xiàn)的更早。需要注意的是,strcmp函數(shù)對于只包含大寫字母或只包含小寫字母的字符串比較。
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函數(shù),該函數(shù)實在s1中查找整個s2第1次出現(xiàn)的起始位置,并返回一個指向該位置的指針。如果s2并沒有出現(xiàn)在s1的任何地方,函數(shù)將返回一個NULL指針。如果第二個函數(shù)是一個空字符串,函數(shù)就返回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第一次出現(xiàn)的位置,找到后函數(shù)返回一個指向該位置的指針。如果該字符并不存在于字符串中,函數(shù)就返回一個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類似的查找函數(shù)還有一個是strrchr,它和strchr的不同之處在于,該函數(shù)返回的是一個指向字符串中該字符最后一次出現(xiàn)的位置
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;
}
長度受限制的字符串函數(shù)
標(biāo)準(zhǔn)庫中還包含一些函數(shù),它們以一種不同的方式去處理字符串。這些函數(shù)接受一個顯示的長度參數(shù),用于限定進(jìn)行復(fù)制或比較的字符數(shù)。 
1.strncpy 
和strcpy一樣,strncpy把源字符串的字符復(fù)制到目標(biāo)空間,但是,它總是正好向dest中拷貝len個字符,如果strlen(src)的值小于len,dest數(shù)組就用額外的'\0'填充到len字節(jié)長度。如果strlen(src)的值大于或等于len,那么只有l(wèi)en個字符被復(fù)制到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中最多復(fù)制len個字符到目標(biāo)數(shù)組的后面。
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個字節(jié)。如果兩個字符串在第len個字符之前存在不相等的字符,這個函數(shù)就像strcmp一樣停止比較,返回結(jié)果。如果兩個字符串的前l(fā)en個字符相等,函數(shù)就返回零。
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;
}
標(biāo)準(zhǔn)庫里的字符串函數(shù)還有很多,今天就先介紹到這里。
以上就是C語言字符串的操作總結(jié) ,如有疑問,請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
欄 目:C語言
下一篇:C語言中字符串的存儲方法
本文標(biāo)題:C語言實現(xiàn)字符串操作函數(shù)的實例
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/1267.html
您可能感興趣的文章
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用函數(shù)刪除字符
 - 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)式函數(shù)庫
 - 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
 - 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對數(shù)怎么表達(dá)
 - 04-02c語言用函數(shù)寫分段 用c語言表示分段函數(shù)
 - 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排序法函數(shù)
 - 04-02c語言沒有round函數(shù) round c語言
 - 04-02c語言分段函數(shù)怎么求 用c語言求分段函數(shù)
 - 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
 - 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求階乘
 


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
 - 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
 - 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
 - 04-02c語言用函數(shù)寫分段 用c語言表示分段
 - 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
 - 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
 - 04-02c語言沒有round函數(shù) round c語言
 - 04-02c語言分段函數(shù)怎么求 用c語言求分段
 - 04-02C語言中怎么打出三角函數(shù) c語言中怎
 - 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
 
隨機(jī)閱讀
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
 - 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
 - 01-10delphi制作wav文件的方法
 - 01-10使用C語言求解撲克牌的順子及n個骰子
 - 04-02jquery與jsp,用jquery
 - 01-11ajax實現(xiàn)頁面的局部加載
 - 08-05織夢dedecms什么時候用欄目交叉功能?
 - 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
 - 01-10C#中split用法實例總結(jié)
 - 08-05DEDE織夢data目錄下的sessions文件夾有什
 


