C 語言中使用 strtok 函式

Jinku Hu 2023年10月12日
  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
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

LinkedIn Facebook

相關文章 - C String