使用 C 語言中的 strsep 函式

Jinku Hu 2021年2月28日
使用 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'
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

相關文章 - C String