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