[C/C++] strpbrk 在字串中找尋指定的符號或字母

繼上一篇:『[C/C++] 切割字串函數:strtok, Network mac address 分割』,內容寫到 Microsoft 用到 strpbrk 來找尋字串中特定符號,並且回傳該符號的位址,用法如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "string.h"
#include "stdlib.h"
#include "stdio.h"

int main ()
{
  char str[] = "This is a sample string";
  char key[] = "aeiou";
  char * pch;
  printf ("Vowels in '%s': ",str);
  pch = strpbrk (str, key);
  while (pch != NULL)
  {
    printf ("%c " , *pch);
    /* 也可以直接輸出字串 */
    printf("\noutput=%s\n", pch);
    pch = strpbrk (pch+1,key);
  }
  printf ("\n");
  system("pause");
  return 0;
}

輸出結果: strpbrk

我們看一下 /usr/src/lib/libc/string/strpbrk.c 原始碼:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
/*
 * Find the first occurrence in s1 of a character in s2 (excluding NUL).
 */
char *
strpbrk(s1, s2)
    const char *s1, *s2;
{
    const char *scanp;
    int c, sc;

    while ((c = *s1++) != 0) {
        for (scanp = s2; (sc = *scanp++) != 0;)
            if (sc == c)
                return ((char *)(s1 - 1));
    }
    return (NULL);
}

首先將指定字串(str),跟愈找尋的字串(key)方別帶入 s1, s2,當跑 while 迴圈時,會先去判斷是否到了字串最後一個字元,判斷是否為 NULL,如果不是,則進入 while 迴圈,在利用 for 迴圈去比對字串 key,其實都是利用 ASCII 轉換比對是否相同,如果相同,則回傳該指定字母之位址,回傳時還需要 s1 -1 呢?因為在 while 條件中已經將字串指到下一個字母位址,所以必需要在重新指回去前一字母。


See also