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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 12:10:20