You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中将字符串拆分为单词并创建动态大小的单词数组?

实现动态扩容的单词数组存储方案

核心思路

要实现动态扩容的单词数组,需要用到指针数组(char **类型)存储每个单词的地址,配合realloc函数动态调整数组大小,同时要为每个单词单独分配内存(避免原字符串被strtok修改导致指针失效)。

完整实现代码

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

int main() {
    char string[100] = "hello goodbye river dog level";
    char **word_array = NULL;  // 动态指针数组,存储单词地址
    int count = 0;             // 当前存储的单词数量
    int capacity = 0;          // 数组当前容量

    // 拆分第一个单词
    char *token = strtok(string, " ");
    while (token != NULL) {
        // 数组容量不足时扩容,初始从2开始,每次翻倍
        if (count >= capacity) {
            capacity = (capacity == 0) ? 2 : capacity * 2;
            // 重新分配数组内存,检查分配是否成功
            char **temp = realloc(word_array, capacity * sizeof(char *));
            if (temp == NULL) {
                perror("realloc failed");
                // 释放已分配的单词内存,避免泄漏
                for (int i = 0; i < count; i++) {
                    free(word_array[i]);
                }
                free(word_array);
                return 1;
            }
            word_array = temp;
        }

        // 为当前单词分配内存并复制内容(strdup等价于malloc+strcpy)
        word_array[count] = strdup(token);
        if (word_array[count] == NULL) {
            perror("strdup failed");
            // 清理已分配资源
            for (int i = 0; i < count; i++) {
                free(word_array[i]);
            }
            free(word_array);
            return 1;
        }
        count++;

        // 获取下一个单词
        token = strtok(NULL, " ");
    }

    // 验证结果:打印数组中的所有单词
    printf("拆分后的单词数组:\n");
    for (int i = 0; i < count; i++) {
        printf("%s\n", word_array[i]);
    }

    // 统计首尾字符相同的单词数量
    int same_count = 0;
    for (int i = 0; i < count; i++) {
        int len = strlen(word_array[i]);
        if (len > 0 && word_array[i][0] == word_array[i][len - 1]) {
            same_count++;
        }
    }
    printf("\n首尾字符相同的单词数量:%d\n", same_count);

    // 释放所有内存,避免泄漏
    for (int i = 0; i < count; i++) {
        free(word_array[i]);
    }
    free(word_array);

    return 0;
}

关键要点说明

  • 动态数组扩容:用realloc调整指针数组大小,初始容量设为2,每次翻倍可减少扩容次数提升效率;每次扩容后必须检查分配是否成功,避免程序崩溃。
  • 单词内存分配:strtok返回的是原字符串内部的指针,原字符串会被strtok修改(用'\0'替换分隔符),因此必须用strdup(或手动malloc+strcpy)为每个单词单独分配内存,确保内容独立保存。
  • 内存泄漏预防:在内存分配失败的分支中,要先释放已分配的内存再退出;程序结束前必须释放所有动态分配的资源。
  • 首尾字符统计:遍历单词数组,用strlen获取单词长度,直接比较第一个字符和最后一个字符即可。

内容的提问来源于stack exchange,提问作者Alexander

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 22:45:37