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

C代码调用strtok出现discarded 'const' qualifier编译错误原因咨询

错误原因
  • strtok函数执行时会直接修改传入的第一个参数字符串的内容(在分隔符位置插入\0实现拆分效果),因此函数原型中第一个参数为char *类型,不接收const修饰的只读指针。
  • 你传入的file_name是const char *类型,属于只读变量,直接传给strtok就会触发「丢弃const限定符」的编译报错。
    另外你的代码存在逻辑顺序问题:你先执行了fopen、strtok、create_gradebook之后才判断文件是否打开成功,若文件打开失败,前面申请的gradebook_t结构体会发生内存泄漏。
修复方案

将file_name复制到一个非const的临时字符数组后,再传入strtok做拆分,同时调整逻辑顺序先判断文件是否打开成功再执行后续操作,参考代码如下:

gradebook_t* read_gradebook_from_binary(const char* file_name) {
  struct student rec;
  char book_name[MAX_NAME_LEN];
  // 先打开文件判断可用性,避免做无效操作
  FILE* file = fopen(file_name, "rb");
  if (!file) {
    printf("Unable to open file!");
    return NULL;
  }
  // 新建临时数组拷贝file_name,避免修改const原始值
  char temp_file_name[MAX_NAME_LEN];
  strncpy(temp_file_name, file_name, MAX_NAME_LEN - 1);
  temp_file_name[MAX_NAME_LEN - 1] = '\0';
  const char* token = strtok(temp_file_name, ".");
  if (token != NULL) { // 判空避免file_name没有.的场景崩溃
    strcpy(book_name, token);
  } else {
    strncpy(book_name, file_name, MAX_NAME_LEN - 1);
    book_name[MAX_NAME_LEN - 1] = '\0';
  }
  gradebook_t* book = create_gradebook(book_name);
  
  while (fread(&rec, sizeof(struct student), 1, file) != 0) {
    add_score(book, rec.name, rec.score);
  }
  fclose(file);
  return book;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 08:57:03