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

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的返回值
  • 内存泄漏:用完动态分配的内存后,必须逐层释放(先释放每个单词的内存,再释放数组本身)

运行说明

  1. 把代码里的your_file.txt改成你要读取的文件名
  2. 编译运行(比如用gcc your_code.c -o word_reader && ./word_reader)
  3. 程序会输出格式和你想要的{"what", "a", "nice","day"}完全一致的结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:52:03