使用 C 語言中的 strsep 函式
本文將演示如何在 C 語言中使用 strsep
函式的多種方法。
使用 strsep
函式在字串中查詢給定標記
strsep
是 C 標準庫字串實用程式的一部分,定義在 <string.h>
標頭檔案中。它可以用來從字串物件中提取被給定定界符包圍的標記。
strsep
需要兩個引數-指向 char*
的指標和指向 char
的指標。第一個引數用於傳遞需要搜尋的字元字串的地址。第二個引數指定了一組定界符,用來標記提取的標記的開始和結束。請注意,在提取的標記字串中,定界符會被丟棄。當找到第一個標記時,第一個引數被修改為儲存指向下一個定界符的指標。
在下面的例子中,我們演示瞭如何使用對 strsep
的單次呼叫,提取兩個以給定字元定界的標記。請注意,程式從 2 個命令列引數中獲取字串和定界符集,如果沒有提供所需的引數,則以失敗退出。接下來,我們用 strdupa
函式呼叫複製字串,因為 strsep
修改了傳遞的指標,我們不想丟失原始值。strdupa
在棧上分配動態記憶體,呼叫者不應該釋放從它返回的指標。
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
char *str1, *token;
if (argc != 3) {
fprintf(stderr, "Usage: %s string delim\n",
argv[0]);
exit(EXIT_FAILURE);
}
str1 = strdupa(argv[1]);
if (!str1)
exit(EXIT_FAILURE);
token = strsep(&str1, argv[2]);
if (token == NULL)
exit(EXIT_FAILURE);
printf("extracted: '%s'\n", token);
printf("left: '%s'\n", str1);
exit(EXIT_SUCCESS);
}
示例命令:
./program "hello there" t
輸出:
extracted: 'hello '
left: 'here'
或者,我們可以實現 for
迴圈,連續呼叫 strsep
函式,並提取每一個帶有給定定界符的標記,而不是隻提取最先遇到的標記-如前面的示例程式碼所示。但請注意,當一行中有兩個定界符時,strsep
會返回一個空字串;因此,呼叫者有責任在處理結果標記之前檢查這一點。類似的功能也可以用 strtok
和 strtok_r
庫函式來提供,但略有不同,在這個頁面上有詳細描述。
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
char *str1, *token;
if (argc != 3) {
fprintf(stderr, "Usage: %s string delim\n",
argv[0]);
exit(EXIT_FAILURE);
}
str1 = strdupa(argv[1]);
if (!str1)
exit(EXIT_FAILURE);
for (int j = 1; ; j++) {
token = strsep(&str1, argv[2]);
if (token == NULL)
break;
printf("%d: '%s'\n", j, token);
}
exit(EXIT_SUCCESS);
}
示例命令:
./program "hello there" tl
輸出:
1: 'he'
2: ''
3: 'o '
4: 'here'
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn