C语言调用strtok时报Access violation writing location错误是什么原因
报错原因
- 核心问题是
strtok函数会直接修改传入的原字符串,会把匹配到的分隔符替换为\0,但你传入函数的是只读的字符串字面量:
main函数中char* stringForNumberSign = "welcome to hello world";定义的字符串存储在进程的只读数据段,没有写入权限,执行写操作就会触发访问冲突。
修复方法
只需要修改main函数中字符串的定义方式,将指向只读字面量的指针改为栈上可修改的字符数组即可:
把char* stringForNumberSign = "welcome to hello world";替换为char stringForNumberSign[] = "welcome to hello world";
补充说明
- 如果你的业务场景中必须处理传入的字符串字面量,可以先调用
strcpy将字面量拷贝到堆/栈上的可写内存空间,再将可写内存的地址传入strtok处理即可。 - 当前代码只实现了单词计数逻辑,还没有完成把
\0替换为#的需求,你可以在计数完成后遍历原字符串,把所有\0位置替换为#即可达到目标效果。
修复后完整可运行代码
#include <stdio.h> #include <string.h> char* addNumberSignToString(char* stringOfNumberSign) { int numOfWords = 0; char* delimiters = " "; char* word = strtok(stringOfNumberSign, delimiters); while (word) { numOfWords++; word = strtok(NULL, delimiters); } // 替换\0为#的逻辑 int totalLen = strlen(stringOfNumberSign) + numOfWords - 1; for(int i=0; i < totalLen; i++){ if(stringOfNumberSign[i] == '\0'){ stringOfNumberSign[i] = '#'; } } return stringOfNumberSign; } int main() { char stringForNumberSign[] = "welcome to hello world"; char* result; result = addNumberSignToString(stringForNumberSign); printf("%s", result); return 0; }
内容的提问来源于stack exchange,提问作者Roee
相关产品推荐
相关产品推荐

