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
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