Visual C中strtok函数出现写入位置访问违例错误求助
问题分析与解决
错误根源
你的代码触发访问违例的核心原因是:strtok函数会直接修改传入的原字符串(用\0替换分隔符来分割出token),但你传入的filepath指向的是字符串常量——这类数据存储在程序的只读内存区域,不允许修改,尝试写入就会触发内存访问错误。
另外还有一个逻辑问题:循环结束后filename已经是NULL,此时printf会打印空值甚至崩溃,你需要在循环中保存最后一个有效的token。
修复方案
1. 使用可修改的字符数组存储路径
把字符串常量复制到栈上的字符数组中,数组内存是可修改的:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char* argv[]) { // 用字符数组存储路径,内存可修改 char filepath[] = "C:\\Users\\RAKESH\\source\\repos\\TESTING\\log.c"; char* filename = strtok(filepath, "\\"); char* last_filename = NULL; // 保存最后一个有效token while (filename != NULL) { last_filename = filename; // 更新最后一个有效文件名 filename = strtok(NULL, "\\"); } if (last_filename != NULL) { printf("%s\n", last_filename); // 打印最后一个token(文件名) } return 0; }
2. 关键知识点说明
strtok的工作机制:第一次调用时传入目标字符串,它会在字符串中找到第一个分隔符,替换为\0并返回第一个token的指针;后续调用传入NULL,会从上次的位置继续分割,直到找不到分隔符返回NULL。整个过程必须修改原字符串,因此原字符串必须是可写的。- 字符串常量(如
char* s = "xxx")是只读的,编译器通常会把它们放到只读数据段,任何修改尝试都会触发内存访问错误。如果需要修改,必须用数组(char s[] = "xxx")或者动态分配内存(malloc+strcpy)来创建可写副本。
内容的提问来源于stack exchange,提问作者nascent
相关产品推荐
相关产品推荐

