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

C++新手字符串处理遇写入访问违规错误:_My_data was 0x7001AC

解决你的C++字符串处理异常问题

嘿,我来帮你排查这个写访问异常的问题!先看你代码里的几个关键问题,咱们一步步解决:

直接导致异常的原因:死循环+数组越界

你代码里的嵌套for循环for (int x = flag; x <= 1; x--)是个死循环!举个例子,假设flag初始是0,x从0开始,每次减1变成-1、-2……而循环条件是x <= 1,负数永远满足这个条件,循环永远不会停。更糟的是,当x变成负数时,你去访问Display[x],这就属于访问了程序不该碰的内存区域,直接触发了write access violation异常。

其他需要修正的潜在问题

除了死循环,你的代码还有几个逻辑漏洞:

  • 字符串越界访问:循环条件i <= Given.length()有问题,因为C++字符串的索引是从0到length()-1,当i等于length()时,Given[i]会访问字符串末尾之外的内存,属于未定义行为。
  • 单词提取逻辑混乱:你用flag来标记单词起始位置,但嵌套循环的逻辑完全偏离了“按数字索引存放单词”的需求。

修正后的完整代码

下面是调整后的代码,完美实现你的需求:

#include <iostream>
#include <string>
#include <cctype>

using namespace std;

void analyze() {
    string Given = "there1hello0";
    string word = "";
    // 根据你的示例,这里用大小为2的数组,若单词数量不确定,建议用vector<string>更灵活
    string Display[2];

    // 遍历字符串时,用size_t避免无符号整数比较问题
    for (size_t i = 0; i < Given.length(); i++) {
        if (isdigit(Given[i])) {
            // 将字符形式的数字转为整数索引(比如'0'转成0,'1'转成1)
            int index = Given[i] - '0';
            // 先检查索引是否合法,防止越界
            if (index >= 0 && index < 2) {
                Display[index] = word;
            }
            // 清空当前单词,准备接收下一个
            word.clear();
        } else {
            // 非数字字符,添加到当前单词中
            word += Given[i];
        }
    }

    // 拼接最终结果
    string result;
    for (const auto& str : Display) {
        result += str;
    }
    cout << result << endl; // 输出 hellothere
}

int main() {
    analyze();
    return 0;
}

关键改动说明

  1. 删掉了冗余的flag变量,简化逻辑,直接通过遍历字符来提取单词
  2. 循环条件改成i < Given.length(),彻底避免字符串越界访问
  3. 遇到数字时,直接将字符转为索引(利用ASCII码特性:'0'的ASCII值是48,所以'n' - '0'就能得到数字n)
  4. 添加了索引合法性检查,防止非法索引导致的内存问题
  5. 最后通过遍历数组拼接结果,得到正确的句子顺序

这样修改后,代码就能正常运行,输出你想要的hellothere啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:26:52