C语言函数无法更新genre参数值问题求助
问题分析与解决方案
核心问题:值传递导致变量无法更新
你的代码中,genre是以值传递的方式传入recuperer_prenom函数的。在C语言里,值传递会创建参数的副本,函数内部对副本的修改完全不会影响主函数中的原始变量。这就是为什么函数内部打印genre正常,但主函数输出时genre始终是未定义的初始值(表现为空)。
修复方案:用指针传递genre
将genre的参数类型改为指针,让函数直接操作主函数里变量的内存地址,这样修改就能同步到外部。
修改后的完整代码
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> int AleaNombre(int min, int max) { return (rand() % (max - min + 1)) + min; } // 修改参数:genre改为char*类型 void recuperer_prenom(char *genre, char prenom[20]) { FILE* f2 = fopen("C:\\Users\\PC PRO DZ\\Desktop\\Projects\\C\\TP essai\\prenom.txt", "r"); if (f2 == NULL) { // 增加文件打开失败判断,避免崩溃 perror("Failed to open file"); return; } fseek(f2, 0, SEEK_END); int length = ftell(f2); fseek(f2, 0, SEEK_SET); char line1[length + 1]; fgets(line1, length + 1, f2); int i = AleaNombre(1, 100); int cpt = 0; char* tok = strtok(line1, " ; "); cpt++; while (cpt != i && tok != NULL) { // 增加tok非空判断,防止越界 tok = strtok(NULL, " ; "); cpt++; } if (tok == NULL) { // 处理找不到对应索引的情况 printf("Invalid index\n"); fclose(f2); return; } char* tok2 = strtok(tok, ","); strcpy(prenom, tok2); tok2 = strtok(NULL, ","); if (tok2 != NULL) { // 确保tok2不为空,避免访问空指针 *genre = tok2[0]; // 通过指针修改外部变量的值 printf("%s %c\n", prenom, *genre); } fclose(f2); } int main () { srand(time(NULL)); char prenom[20]; char genre; recuperer_prenom(&genre, prenom); // 传入genre的地址 printf("%s %c\n", prenom, genre); return 0; }
关键修改点
- 函数参数:
char genre→char *genre,接收外部变量的内存地址 - 主函数调用:
recuperer_prenom(genre, prenom)→recuperer_prenom(&genre, prenom),传入genre的地址 - 函数内部赋值:
genre = tok2[0]→*genre = tok2[0],通过指针间接修改外部变量 - 新增文件打开失败、
tok/tok2为空的判断,提升代码健壮性
额外说明
你之前尝试把genre改成字符串仍未解决问题,大概率是同样犯了值传递的错误——如果传递的是字符串数组,数组会退化为指针,但如果要修改指针本身(而非指向的内容),需要传递指针的指针。但这里genre是单个字符,用一级指针就足够解决问题。
内容的提问来源于stack exchange,提问作者ConnorRK987
相关产品推荐
相关产品推荐

