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

C语言结构体数组存字符串及出现次数功能异常求助

排查C语言结构体数组单词计数功能的常见问题

嘿,我太懂这种编译全绿但功能完全不对的抓狂感了——语法合规可不代表逻辑走对了路。咱们一步步拆解你的Add_To_Array函数可能踩的坑,顺便给你一套可直接验证的修复方案。

最容易踩的坑:用指针比较代替字符串内容比较

C语言里字符串本质是字符数组的指针,如果你用==判断两个单词是否相等,比的是内存地址而不是字符串内容。这会导致永远找不到已存在的单词,每次都执行新增操作。

❌ 错误示例:

// 永远不会匹配成功,除非两个指针指向同一块内存
if (array[i].word == new_word) {
    array[i].count++;
}

✅ 正确写法:

// 用strcmp比较字符串内容,返回0表示完全相等
if (strcmp(array[i].word, new_word) == 0) {
    array[i].count++;
    return; // 找到就直接返回,不用继续遍历
}

第二个常见问题:未正确跟踪数组的有效元素数

你需要一个变量专门记录数组里已经存储了多少个单词,而且必须传递它的指针给Add_To_Array函数——不然函数内部对计数的修改无法同步到主函数里,导致要么重复遍历无效区域,要么越界写入。

这里给你一个完整的Add_To_Array实现:

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

// 先定义你的结构体
typedef struct {
    char* word;
    int count;
} WordCount;

void Add_To_Array(WordCount* array, int* current_count, int max_capacity, const char* new_word) {
    // 第一步:遍历已有的有效元素,检查是否存在目标单词
    for (int i = 0; i < *current_count; i++) {
        if (strcmp(array[i].word, new_word) == 0) {
            array[i].count++;
            return;
        }
    }

    // 第二步:检查数组是否还有剩余容量
    if (*current_count >= max_capacity) {
        fprintf(stderr, "数组已满,无法添加新单词:%s\n", new_word);
        return;
    }

    // 第三步:为新单词分配独立内存(必须做!不然会指向临时缓冲区导致数据覆盖)
    array[*current_count].word = malloc(strlen(new_word) + 1);
    if (array[*current_count].word == NULL) {
        perror("内存分配失败");
        return;
    }
    strcpy(array[*current_count].word, new_word);
    array[*current_count].count = 1;
    (*current_count)++; // 注意括号,确保先解引用再自增
}

配套的Print_All函数也要对应调整

如果Print_All遍历的是数组总容量而不是实际有效元素数,会打印出未初始化的垃圾数据。正确的实现应该是:

void Print_All(const WordCount* array, int current_count) {
    puts("=== 单词统计结果 ===");
    for (int i = 0; i < current_count; i++) {
        printf("%-15s 出现次数:%d\n", array[i].word, array[i].count);
        free(array[i].word); // 记得释放内存,避免泄漏
    }
}

额外提醒:文件读取的预处理逻辑

如果你的单词统计需要忽略大小写、过滤标点(比如把"hello,"和"hello"当成同一个单词),可以在调用Add_To_Array前对读取到的字符串做预处理:

// 示例:把字符串转成小写
void to_lower(char* str) {
    for (int i = 0; str[i]; i++) {
        if (str[i] >= 'A' && str[i] <= 'Z') {
            str[i] += 32;
        }
    }
}

// 读取文件时的调用示例
char buffer[100];
FILE* fp = fopen("your_text.txt", "r");
if (!fp) {
    perror("打开文件失败");
    return 1;
}
while (fscanf(fp, "%s", buffer) != EOF) {
    to_lower(buffer);
    Add_To_Array(word_array, &current_count, MAX_WORDS, buffer);
}
fclose(fp);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:23:27