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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 12:06:05