使用 C 語言中的 strsep 函式

Jinku Hu 2023年10月12日
使用 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 會返回一個空字串;因此,呼叫者有責任在處理結果標記之前檢查這一點。類似的功能也可以用 strtokstrtok_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'
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook

相關文章 - C String