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

C语言中for循环内strcpy函数无法正常工作的问题咨询

嘿,我来帮你排查下代码里的问题!你的程序之所以没输出字符串,甚至可能隐藏着内存错误,主要是这几个关键问题导致的:

1. 字符串数组的内存根本没分配

你定义的char *words[50000];是一个存放字符指针的数组,但每个指针一开始都是野指针(指向内存里的随机位置),根本没有指向一块有效的内存空间来存储字符串。这时候直接用strcpy操作,完全是在瞎折腾内存,必然会出问题。

2. strcpy的参数顺序搞反了

strcpy的用法是strcpy(目标地址, 源字符串),你写的strcpy(word, words[i]);刚好搞反了——你本来想把word里的内容复制到words[i],结果写成了把野指针的内容往word里塞,这完全不是你要的效果。

3. fscanf的参数多了个多余的&

word是数组名,本身就代表数组首元素的地址,不需要加&,写成fscanf(dict, "%s %d", word, &weight);就对了。加&虽然某些编译器能凑活,但不符合C语言的规范,容易让人混淆。

4. 循环逻辑不合理,还没做文件检查

你硬循环50000次,但文件里的数据可能没这么多,当fscanf读取失败后还继续赋值,会产生无效数据。而且你没检查文件是否成功打开——如果dict.txt不存在,fopen会返回NULL,后续操作直接就崩了。


给你修正后的代码,每一步都加了注释:

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

int main (void) {
    FILE* dict;
    char word[50];
    int weight;
    int weights[50000];
    char *words[50000];
    int i = 0;

    // 先检查文件能不能打开,避免空指针操作
    dict = fopen("dict.txt", "r");
    if (dict == NULL) {
        printf("无法打开dict.txt文件!\n");
        return 1;
    }

    // 循环读取数据:直到文件读完,或者读取失败,或者数组存满
    while (fscanf(dict, "%s %d", word, &weight) == 2 && i < 50000) {
        weights[i] = weight;
        // 为每个字符串分配内存:长度是word的实际长度+1(要存字符串结束符'\0')
        words[i] = malloc(strlen(word) + 1);
        if (words[i] == NULL) { // 内存分配失败的情况也要处理
            printf("内存分配失败!\n");
            return 1;
        }
        // 把word里的内容复制到刚分配的内存里
        strcpy(words[i], word);
        i++;
    }

    // 打印测试:先确认确实读到了数据,不然数组是空的
    if (i > 0) {
        printf("%s\n", words[0]);
        printf("%d\n", weights[0]);
    } else {
        printf("没有读取到任何数据!\n");
    }

    // 记得释放分配的内存,避免内存泄漏
    for (int j = 0; j < i; j++) {
        free(words[j]);
    }

    fclose(dict);
    return 0;
}

关键修正点说明:

  • 加了文件打开检查,避免空指针崩溃;
  • 用while循环代替固定次数的for,通过fscanf的返回值判断是否成功读取了一组数据;
  • 每次读取字符串后,用malloc分配足够的内存,再用strcpy把内容复制过去;
  • 最后释放了所有分配的内存,避免内存泄漏;
  • 打印前先判断是否有数据,防止访问空数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 18:22:43