[C/C++] cstring (string.h) 搜尋函式:strstr, strchr

strstr

這次介紹 C 語言常用 string 函式:strstr,主要是針對兩個輸入參數做比對,Parameters 1輸入字串Parameters 2找尋字串,strstr 會先將頭一次比對成功的 pointer 回傳,也就是如果要找尋 appleboyappleboy 字串中的 boy,函式會回傳第一次比對成功的 boy pointer,而並非回傳最後一個比對到的,底下是一個參考範例:
/* strstr example */
#include 
#include 

int main ()
{
  char str[] ="This is a simple string";
  char * pch;
  /* 找尋 simple 字串 */
  pch = strstr (str,"simple");
  /* 將 simple 換成 sample */
  strncpy (pch,"sample",6);
  puts (str);
  return 0;
}
看一下 Kernel 原始檔案,strstr 函式:
/*
 * Find the first occurrence of find in s.
 */
char *
strstr(s, find)
    const char *s, *find;
{
    char c, sc;
    size_t len;

    if ((c = *find++) != 0) {
        len = strlen(find);
        do {
            do {
                if ((sc = *s++) == 0)
                    return (NULL);
            } while (sc != c);
        } while (strncmp(s, find, len) != 0);
        s--;
    }
    return ((char *)s);
}
先將 sc 指定為內容字串,c 指定為找尋字串,利用兩個迴圈開始一一筆對,利用 strncmp 比對字串,在將比對成功的 pointer 回傳,但是回傳之前需要在將 s– 回到前一個指標,這樣就ok了。

strchr

這字串用來找尋第一次比對成功單一字母符號,也是一樣回傳該指標,底下是範例:
/* strchr example */
#include 
#include 

int main ()
{
  char str[] = "This is a sample string";
  char * pch;
  printf ("Looking for the 's' character in \"%s\"...\n",str);
  pch=strchr(str,'s');
  while (pch!=NULL)
  {
    printf ("found at %d\n",pch-str+1);
    pch=strchr(pch+1,'s');
  }
  return 0;
}
上面範例很容易,那底下來看看完整 strchr 程式碼:
char * strchr
(const char *p, int ch)
{
    char c;

    c = ch;
    for (;; ++p) {
        if (*p == c)
            return ((char *)p);
        if (*p == '\0')
            return (NULL);
    }
    /* NOTREACHED */
}
就只能針對單一字母符號做搜尋,跟 strstr 不同的是 strstr 是針對多個字母符號搜尋,很好區別吧 ^^。
  • Pingback: strstr 与 strchr | C++学习笔记()

  • 林柏年

    想請問函數底下的操作原始碼該如何檢視呢? 謝謝 ^_^

  • appleboy48

    你是說如何找到這些原始碼?

  • 林柏年

    恩恩 就像 strchr() 的底層操作 謝謝 ^_^
    char * strchr
    (const char *p, int ch)
    {
    char c;

    c = ch;
    for (;; ++p) {
    if (*p == c)
    return ((char *)p);
    if (*p == ”)
    return (NULL);
    }
    /* NOTREACHED */
    } 覺得你講解的很詳細 ~

  • qiying

    裝 source insight
    這軟體的特長就是往源頭找非常方便

  • 張國松

    You can find the string.h file and open it.