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; }
关键改动说明
- 删掉了冗余的
flag变量,简化逻辑,直接通过遍历字符来提取单词 - 循环条件改成
i < Given.length(),彻底避免字符串越界访问 - 遇到数字时,直接将字符转为索引(利用ASCII码特性:
'0'的ASCII值是48,所以'n' - '0'就能得到数字n) - 添加了索引合法性检查,防止非法索引导致的内存问题
- 最后通过遍历数组拼接结果,得到正确的句子顺序
这样修改后,代码就能正常运行,输出你想要的hellothere啦!
内容的提问来源于stack exchange,提问作者Mor Katz
相关产品推荐
相关产品推荐

