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

