C语言中,使用多个分隔符来拆分字符串,在处理文本数据时非常常见,比如解析 CSV 文件或从结构化字符串中提取值。使用多个分隔符拆分字符串通常可以通过 strtok 函数来实现。strtok 函数可以指定多个分隔符。你\只需要将多个分隔符字符传递给它,它会自动处理。也可以使用自定义的函数或正则表达式等方法实现。

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

推荐文档

相关文档

大家感兴趣的内容

随机列表