首页 > 编程笔记 > C语言笔记

C语言字符串分割(附带示例)

所谓字符串分割,就是将一个长字符串拆分成多个子字符串,这在处理用户输入、解析配置文件或处理各种文本数据时都非常有用。
 

字符串分割的核心思想是找到分隔符(例如空格、逗号或任何指定的字符),然后在这些位置“切断”字符串。在C语言中,我们通常通过以下步骤来实现这一过程:

  1. 找到分隔符的位置;
  2. 将分隔符替换为字符串结束符'\0'
  3. 记录每个子字符串的起始位置。

使用 strtok 函数

C语言标准库提供了一个非常有用的函数 strtok(),它可以帮助我们轻松地实现字符串分割。strtok() 函数定义在 string.h 头文件中,它的原型如下:

char *strtok(char *str, const char *delim);

参数说明:


返回值:返回指向分割后的子字符串的指针,如果没有可分割的部分则返回 NULL。


strtok 函数的工作原理是在原字符串中查找分隔符,并用'\0'替换找到的分隔符,然后返回指向子字符串开始的指针。这意味着原字符串会被修改,因此在使用 strtok 时需要注意以下几点:


下面是一个使用 strtok 函数分割字符串的示例:

#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "Hello,World,C,Programming";
    const char delim[] = ",";
    char *token;

    token = strtok(str, delim);
    while (token != NULL) {
        printf("%s\n", token);
        token = strtok(NULL, delim);
    }

    return 0;
}

这个程序的输出结果如下:

Hello
World
C
Programming

自定义字符串分割函数

虽然 strtok 函数很方便,但它有一些限制,如修改原字符串和非线程安全。为了克服这些限制,我们可以实现一个自定义的字符串分割函数。以下是一个不修改原字符串的字符串分割函数实现:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char** split_string(const char* str, const char* delim, int* count) {
    char* copy = strdup(str);
    char* token = strtok(copy, delim);
    char** result = NULL;
    *count = 0;

    while (token != NULL) {
        result = realloc(result, (*count + 1) * sizeof(char*));
        result[*count] = strdup(token);
        (*count)++;
        token = strtok(NULL, delim);
    }

    free(copy);
    return result;
}

int main() {
    const char* str = "Hello,World,C,Programming";
    const char* delim = ",";
    int count;
    char** tokens = split_string(str, delim, &count);

    for (int i = 0; i < count; i++) {
        printf("%s\n", tokens[i]);
        free(tokens[i]);
    }
    free(tokens);

    return 0;
}

这个自定义函数的优点包括:


使用自定义函数时,需要注意正确释放动态分配的内存,以避免内存泄漏。

性能比较和使用建议

strtok 函数和自定义分割函数各有优缺点:

strtok 函数

自定义分割函数


选择使用哪种方法取决于具体的应用场景:


无论选择哪种方法,都应该充分理解其工作原理和潜在的陷阱,以确保在实际应用中正确高效地使用字符串分割功能。


声明:《C语言系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。