1、使用 strtok 配合多个分隔符
strtok
是 C 语言中常用的字符串拆分函数,但它一次只能处理一个分隔符。要使用多个分隔符拆分字符串,可以传入一个包含所有分隔符的字符串。
#include <stdio.h> #include <string.h> int main() { char str[] = "apple,orange;banana|grape"; char *delim = ",;|"; // 多个分隔符 char *token = strtok(str, delim); while (token != NULL) { printf("%s\n", token); token = strtok(NULL, delim); } return 0; }
2、 使用自定义代码处理多个分隔符
需要更多的控制或者想要处理多个连续的分隔符,可以编写自定义代码来拆分字符串。一个简单的方法是使用循环并检查每个字符。
#include <stdio.h> #include <string.h> #include <ctype.h> void split_string(char *str, const char *delims) { char *start = str; char *end = str; while (*end) { if (strchr(delims, *end)) { // 检查当前字符是否是分隔符 if (start != end) { *end = '\0'; // 将当前子字符串以空字符结束 printf("%s\n", start); } start = end + 1; } end++; } // 如果有剩余的子字符串,输出它 if (start != end) { printf("%s\n", start); } } int main() { char str[] = "apple,orange;banana|grape"; split_string(str, ",;|"); return 0; }
3、使用 strtok_r(线程安全版本)
如需要线程安全版本的 strtok
,可以使用 strtok_r
。该函数与 strtok
类似,但它使用一个由用户提供的 saveptr
来保持状态,因此是线程安全的。
#include <stdio.h> #include <string.h> int main() { char str[] = "apple,orange;banana|grape"; char *delim = ",;|"; char *token; char *saveptr; token = strtok_r(str, delim, &saveptr); while (token != NULL) { printf("%s\n", token); token = strtok_r(NULL, delim, &saveptr); } return 0; }
4、使用 sscanf 拆分多个分隔符
对于简单的情况,你还可以使用 sscanf
配合格式字符串来拆分字符串。
#include <stdio.h> int main() { char str[] = "apple,orange;banana|grape"; char token[50]; // 读取第一个子字符串 if (sscanf(str, "%49[^,;|]", token) == 1) { printf("%s\n", token); // apple } // 继续读取下一个子字符串 if (sscanf(str + strlen(token), "%49[^,;|]", token) == 1) { printf("%s\n", token); // orange } // 继续处理其余的子字符串... return 0; }
5、使用 regex.h(适用于复杂情况)
如需要更高级的解析,如处理复杂的分隔符或模式,可以使用 regex.h
库中的正则表达式。
#include <stdio.h> #include <regex.h> int main() { char *str = "apple,orange;banana|grape"; regex_t regex; regmatch_t pmatch[1]; regcomp(®ex, "[,;|]", REG_EXTENDED); char *start = str; while (regexec(®ex, start, 1, pmatch, 0) == 0) { // 打印子字符串 char token[50]; strncpy(token, start, pmatch[0].rm_so); token[pmatch[0].rm_so] = '\0'; printf("%s\n", token); start += pmatch[0].rm_eo; } regfree(®ex); return 0; }