抛出异常:写访问冲突。 _My_data 为 0x7001AC
Posted
技术标签:
【中文标题】抛出异常:写访问冲突。 _My_data 为 0x7001AC【英文标题】:Exception thrown: write access violation. _My_data was 0x7001AC 【发布时间】:2018-04-17 19:21:30 【问题描述】:我是 C++ 初学者。我尝试编写一个获取某个字符串的代码,例如 - "there1hello0"
。我试着用它造一个句子,遵循这个规则:
每个单词都以一个数字结尾,指明它在句子中的位置。
所以这句话是:"hellothere"
。
我的代码:
void analyze()
string Given = "there1hello0";
int flag = 0;
string word = "";
string Display[2];
for (int i = 0; i <= Given.length(); i++)
if (isdigit(Given[i]))
for (int x = flag; x <= 1; x--)
word += Given[i - x];
Display[(int)Given[i]] = word;
word = "";
flag = 0;
else
flag++;
for (int z = 0; z <= 1; z++)
cout << Display[z];
int main()
analyze();
system("pause");
return 0;
我已经包含了 <string>
和 <iostream>
库并使用了命名空间 std。
出于某种原因,我无法弄清楚。因为我无法真正理解异常,所以我的代码不起作用并抛出以下内容:
Exception thrown: write access violation. _My_data was 0x7001AC.
任何帮助将不胜感激。
【问题讨论】:
请学习如何使用调试器。在它的帮助下,可以轻松找到这类问题。 提示:问题是你没有从循环中找到数字的索引开始。 【参考方案1】:您可以使用调试器轻松跟踪错误。我强烈建议学习如何使用它。 但无论如何,您的代码有很多问题。首先,你应该了解 for 循环是如何工作的,以及你应该如何遍历字符串。
for (int i = 0; i <= Given.length(); i++)
应该是
for (int i = 0; i < Given.length(); i++)
所以你应该使用<=
而不是<
。因为如果 n 是长度,则字符串的最后一个元素存储在位置 n-1 上,因为您从 0 开始迭代。
也在你的内部循环中
for (int x = flag; x <= 1; x--)
您正在向下迭代,因此您应该比较 x >= 1
而不是 x <= 1
。
同样,(int)Given[i]
返回一个 ASCII 值的 char 存储在 Given[i]
中。例如,如果Given[i]='0'
那么(int)Given[i]
将返回char '0' 的ascii 值,即48 而不是你想象的0。
您可以在此处找到有关此问题的更多信息:Convert char to int in C and C++。
【讨论】:
非常感谢!设法修复它,现在它可以工作了。只有一周的时间来 c++... 我马上开始学习如何使用调试器。 “应该是for (int i = 0; i < Given.length(); i++)
” - 我会说应该。成为for (const auto& i : Given)
...以上是关于抛出异常:写访问冲突。 _My_data 为 0x7001AC的主要内容,如果未能解决你的问题,请参考以下文章
抛出异常:读取访问冲突。 **dynamicArray** 为 0x1118235。发生了
抛出未处理的异常:读取访问冲突。 x 是 0x20B4112