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

