C 語言中使用 strtok 函式

Jinku Hu 2023年1月30日 2021年2月7日
  1. 使用 strtok 函式對給定定界符的字串進行標記化處理
  2. 使用 strtok_r 函式對帶有兩個定界符的字串進行標記化
C 語言中使用 strtok 函式

本文將演示如何在 C 語言中使用 strtok 函式的多種方法。

使用 strtok 函式對給定定界符的字串進行標記化處理

strtok 函式是 C 標準庫的一部分,定義在 <string.h> 標頭檔案中。它將給定的字串分解成由指定定界符分割的標記。strtok 需要兩個引數-第一個引數是指向要標記化的字串的指標,第二個引數是定界符字串。請注意,定界符字串是作為一組字元來處理的,表示單獨的定界符。函式返回指向一個空結束的字串的指標,它代表下一個標記。不過要注意的是,當同一個字串被多次呼叫 strtok 進行解析時,在第一次呼叫函式後,第一個指標引數必須是 NULL

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
    char *str1, *token;
    int j;

    if (argc != 3) {
        fprintf(stderr, "Usage: %s string delim\n",
                argv[0]);
        exit(EXIT_FAILURE);
    }

    for (j = 1, str1 = argv[1]; ; j++, str1 = NULL) {
        token = strtok(str1, argv[2]);
        if (token == NULL)
            break;
        printf("%d: %s\n", j, token);
    }

    exit(EXIT_SUCCESS);
}

示例命令:

./program "Temporary string to be parsed" " "

輸出:

1: Temporary
2: string
3: to
4: be
5: parsed

使用 strtok_r 函式對帶有兩個定界符的字串進行標記化

另外,還有另一個版本的函式,叫做 strtok_r,它是一個重入式變體,更適合多執行緒程式。這兩個函式都會修改作為第一個引數傳遞的字串,而且它們不能對常量字串進行修改。下面的示例程式碼將給定的字串 token 化為一個兩層的層次結構。第一個層次由作為程式第二個引數傳遞的定界符上的標記組成。內部迴圈將每個標記從初始標記化中分割出來,最後,程式將結果輸出到控制檯。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
    char *str1, *str2, *token, *subtoken;
    char *saveptr1, *saveptr2;
    int j;

    if (argc != 4) {
        fprintf(stderr, "Usage: %s string delim subdelim\n",
                argv[0]);
        exit(EXIT_FAILURE);
    }

    for (j = 1, str1 = argv[1]; ; j++, str1 = NULL) {
        token = strtok_r(str1, argv[2], &saveptr1);
        if (token == NULL)
            break;
        printf("%d: %s\n", j, token);

        for (str2 = token; ; str2 = NULL) {
            subtoken = strtok_r(str2, argv[3], &saveptr2);
            if (subtoken == NULL)
                break;
            printf(" --> %s\n", subtoken);
        }
    }

    exit(EXIT_SUCCESS);
}

示例命令:

./program "Temporary string to be parsed" " " "aeio"

輸出:

1: Temporary
 --> T
 --> mp
 --> r
 --> ry
2: string
 --> str
 --> ng
3: to
 --> t
4: be
 --> b
5: parsed
 --> p
 --> rs
 --> d
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