C语言中如何让全局结构体变量值在各函数中保持不变?
问题分析与解决思路
首先,你的核心问题出在变量作用域上:你在main函数里操作的是全局的joueurs2数组,但在其他打印函数里,你大概率又重新声明了一个同名的struct joueursstruct joueurs2[50];——这会创建一个局部变量,它会覆盖全局变量的可见性,而局部数组默认初始化全为0,所以你打印出来的都是0。
直接解决办法:移除局部重声明
你只需要在其他函数里不要重新定义joueurs2数组,直接使用全局版本即可。比如你的打印函数应该写成这样:
void afficherJoueurs() { int indice1; // 注意:这里不要写 struct joueursstruct joueurs2[50]; for (indice1 = 0; indice1 < 50; indice1++) { printf("%d\t %s\t %s\t %s %d\t %d\t %d\t %d\n", joueurs2[indice1].numero, joueurs2[indice1].equipe, joueurs2[indice1].prenom, joueurs2[indice1].nom, joueurs2[indice1].buts, joueurs2[indice1].assist, joueurs2[indice1].penal, joueurs2[indice1].points); } }
只要全局的joueurs2已经在文件顶部正确声明(也就是你给出的结构体定义:struct joueursstruct {...} joueurs2[50];),其他函数就能直接访问它的内容,不会丢失数据。
额外优化建议(非核心,但能避免其他坑)
你的文件读取代码有几个小问题,可能导致数据读取错误,顺便帮你修正:
fscanf(fptr,"%[^ ]s",...)里的s是多余的,%[^ ]本身就是读取非空格字符串的格式符,应该改成%[^ ];- 用
buffer读取换行/空格的方式不太可靠,可以直接在fscanf格式串里加空格跳过空白字符,比如:
for(indice1 = 0; indice1 < 50; indice1++) { // 格式串里的空格会自动跳过所有空白(换行、空格、制表符) fscanf(fptr," %d", &joueurs2[indice1].numero); fscanf(fptr," %[^ ]", joueurs2[indice1].equipe); // 注意equipe是数组名,不用& fscanf(fptr," %[^ ]", joueurs2[indice1].prenom); fscanf(fptr," %[^ ]", joueurs2[indice1].nom); fscanf(fptr," %d", &joueurs2[indice1].buts); fscanf(fptr," %d", &joueurs2[indice1].assist); fscanf(fptr," %d", &joueurs2[indice1].penal); joueurs2[indice1].points = joueurs2[indice1].buts + joueurs2[indice1].assist; }
另外,要确保你的文件内容格式和fscanf的读取格式完全匹配,否则会出现读取错位的问题。
替代方案:避免全局变量(更规范的写法)
如果不想用全局变量(全局变量容易导致代码耦合性高),可以把joueurs2数组作为参数传递给其他函数。因为数组传参本质是传指针,所以修改的是原数组的内容:
// 先typedef结构体,简化后续使用 typedef struct { int numero; char equipe[4]; char prenom[50]; char nom[50]; int buts; int assist; int penal; int points; } JoueursStruct; // main函数里的数组 int main() { JoueursStruct joueurs2[50]; // 读取文件到joueurs2... // 调用打印函数,传递数组和长度 afficherJoueurs(joueurs2, 50); return 0; } // 打印函数接收数组指针和长度 void afficherJoueurs(JoueursStruct *joueurs, int taille) { int i; for (i = 0; i < taille; i++) { printf("%d\t %s\t %s\t %s %d\t %d\t %d\t %d\n", joueurs[i].numero, joueurs[i].equipe, joueurs[i].prenom, joueurs[i].nom, joueurs[i].buts, joueurs[i].assist, joueurs[i].penal, joueurs[i].points); } }
这种写法更符合模块化编程的规范,也不会出现全局变量的作用域问题。
内容的提问来源于stack exchange,提问作者Jeremy Stubbert
相关产品推荐
相关产品推荐

