您的位置:

如何用C语言将字符串分割成数组

在C语言中,字符串是char类型的数组,而有时我们需要将字符串按照一定规则切割成若干个子字符串,存储到一个新的数组中。这样的需求在文本处理、数据处理等方面都是非常常见的。本文将从多个方面详细阐述如何使用C语言将字符串分割成数组。

一、切割标准:分隔符

分割字符串最常见的方法是使用分隔符。分隔符可以是任何单个字符,如空格、逗号、制表符、分号等。可以使用C函数strtok()实现字符串的切割。

#include <string.h>
#include <stdio.h>
int main() {
  char str[] = "This is a sample string";
  const char delim[] = " "; // 分隔符为空格
  char* token = strtok(str, delim);
  while (token != NULL) {
    printf("%s\n", token);
    token = strtok(NULL, delim);
  }
  return 0;
}

上述代码使用空格作为分隔符,输出结果为:

This
is
a
sample
string

可以通过修改分隔符数组delim来实现使用不同的分隔符进行字符串的切割。

二、切割标准:固定长度

另外一种简单的切割方法是按照固定的长度进行切割,即将字符串均分成若干个长度相同的子串。以下代码使用固定长度5对字符串进行切割:

#include <string.h>
#include <stdio.h>
int main() {
  char str[] = "0123456789";
  const int len = 5; // 切割长度为5
  int pos = 0;
  while (pos < strlen(str)) {
    char temp[len + 1];
    strncpy(temp, str + pos, len);
    temp[len] = '\0';
    printf("%s\n", temp);
    pos += len;
  }
  return 0;
}

输出结果为:

01234
56789

可以看到,使用固定长度进行切割需要手动维护切割的位置,首先需要使用strlen()函数获取字符串长度,然后使用strncpy()函数将指定长度的子串复制到一个新的数组中。

三、切割标准:正则表达式

正则表达式可以通过模式匹配的方式将字符串切割成多个部分。在C语言中,可以使用第三方库PCRE(Perl Compatible Regular Expressions)来实现正则表达式的功能。

#include <pcre.h>
#include <stdio.h>
int main() {
  const char pattern[] = "a(bc)*d"; // 匹配abcccbcd
  const char test[] = "abcbcbcd";
  pcre* re = pcre_compile(pattern, 0, NULL, NULL, NULL);
  int ovector[30];
  int rc = pcre_exec(re, NULL, test, strlen(test), 0, 0, ovector, 30);
  if (rc >= 0) {
    for (int i = 0; i < rc; i++) {
      char* substring_start = test + ovector[2 * i];
      int substring_length = ovector[2 * i + 1] - ovector[2 * i];
      printf("%.*s\n", substring_length, substring_start);
    }
  }
  return 0;
}

上述代码使用正则表达式"abcccbcd"将字符串"abcbcbcd"切割成3个部分。输出结果为:

abcccbcd
bcccb
d

需要注意的是,使用正则表达式进行字符串的切割可以极大地提高处理效率,但需要使用第三方库。

四、多种分割方式的比较

以上介绍了使用分隔符、固定长度和正则表达式三种方法对字符串进行切割。下面对它们在以下几个方面进行比较。

1. 处理效率

从处理效率上来看,固定长度切割是最快的,因为它只需要在每个固定位置上截取子字符串。分隔符切割次之,虽然需要在每个分隔符处查找,但查找的过程可以使用C标准库中的strtok()函数实现,非常方便。正则表达式切割是效率最低的,因为其需要使用复杂的模式匹配算法,同时需要加载PCRE库。

2. 可扩展性

从可扩展性上看,正则表达式切割是最好的,因为正则表达式可以描述非常复杂的模式,可以满足各种需求。而固定长度和分隔符的切割则只适用于简单场景。在实际开发中,如果需要支持多种不同的分割方式,可以考虑使用正则表达式。

3. 算法复杂度

从算法复杂度上来看,固定长度切割的算法复杂度为O(n),分隔符切割的算法复杂度为O(n^2),而正则表达式切割的算法复杂度为O(2^n)。正则表达式的复杂度会随着模式的复杂度指数级增加。

需要根据实际需求选择合适的字符串切割方式,对于简单场景,可以使用固定长度或分隔符的方式切割字符串;对于复杂场景,可以考虑使用正则表达式实现。