C语言数组添加字符串求助:向strs数组添加"woo"报错
解决C语言中动态存储文件单词到字符串数组的问题
Hey there! Let's tackle this problem step by step—since you're new to C, I'll break this down in plain terms so you can follow along easily.
首先,你遇到的核心问题应该是:C语言里静态字符串数组的大小是固定的,比如char *strs[] = {"what", "a", "nice", "day"}是编译时就分配好内存的,没法直接“添加”新元素。要实现动态存储未知数量的单词,我们得用动态内存分配来搞定。
下面是完整的实现思路和代码:
步骤1:核心思路拆解
- 打开目标TXT文件,必须检查是否打开成功(新手很容易忽略这一步)
- 逐行读取文件内容,用字符串分割函数拆分每行里的单词
- 用动态数组(配合
malloc/realloc)来存储单词,每找到一个单词就扩容数组 - 最后记得释放所有动态分配的内存,避免内存泄漏
步骤2:完整示例代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #define INITIAL_SIZE 4 // 初始数组大小,可根据需求调整 #define BUFFER_SIZE 1024 // 每行最大读取长度 int main() { FILE *file = fopen("your_file.txt", "r"); if (!file) { perror("Failed to open file"); return 1; } // 动态字符串数组:存储每个单词的指针 char **word_array = malloc(INITIAL_SIZE * sizeof(char *)); if (!word_array) { perror("Failed to allocate memory"); fclose(file); return 1; } int word_count = 0; int current_capacity = INITIAL_SIZE; char buffer[BUFFER_SIZE]; // 逐行读取文件 while (fgets(buffer, BUFFER_SIZE, file) != NULL) { // 去掉换行符(如果存在) buffer[strcspn(buffer, "\n")] = '\0'; // 分割每行的单词,分隔符设为空格、制表符等 char *token = strtok(buffer, " \t"); while (token != NULL) { // 如果数组满了,扩容(每次翻倍,效率更高) if (word_count >= current_capacity) { current_capacity *= 2; char **temp = realloc(word_array, current_capacity * sizeof(char *)); if (!temp) { perror("Failed to reallocate memory"); // 释放已分配的内存,避免泄漏 for (int i = 0; i < word_count; i++) { free(word_array[i]); } free(word_array); fclose(file); return 1; } word_array = temp; } // 复制单词到新分配的内存(不能直接存token,因为token指向buffer的临时内存) word_array[word_count] = malloc(strlen(token) + 1); if (!word_array[word_count]) { perror("Failed to allocate memory for word"); // 清理资源 for (int i = 0; i < word_count; i++) { free(word_array[i]); } free(word_array); fclose(file); return 1; } strcpy(word_array[word_count], token); word_count++; // 获取下一个单词 token = strtok(NULL, " \t"); } } // 打印结果,验证是否正确存储 printf("Stored words:\n"); printf("{"); for (int i = 0; i < word_count; i++) { printf("\"%s\"%s", word_array[i], (i == word_count - 1) ? "" : ", "); } printf("}\n"); // 释放所有内存 for (int i = 0; i < word_count; i++) { free(word_array[i]); } free(word_array); fclose(file); return 0; }
新手容易踩的坑
- 直接用静态数组添加元素:静态数组大小固定,越界访问会导致程序崩溃或未定义行为
- 忘记复制单词内存:
strtok返回的指针指向buffer的临时内存,下一次读取行时会被覆盖,必须用malloc+strcpy保存单词 - 忽略内存分配失败的情况:C语言不会自动处理内存分配失败,必须检查
malloc/realloc的返回值 - 内存泄漏:用完动态分配的内存后,必须逐层释放(先释放每个单词的内存,再释放数组本身)
运行说明
- 把代码里的
your_file.txt改成你要读取的文件名 - 编译运行(比如用
gcc your_code.c -o word_reader && ./word_reader) - 程序会输出格式和你想要的
{"what", "a", "nice","day"}完全一致的结果
内容的提问来源于stack exchange,提问作者user9452443
相关产品推荐
相关产品推荐

