如何在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
相关产品推荐
相关产品推荐

