抛出异常:写访问冲突。 _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;

我已经包含了 &lt;string&gt;&lt;iostream&gt; 库并使用了命名空间 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++)

所以你应该使用&lt;= 而不是&lt;。因为如果 n 是长度,则字符串的最后一个元素存储在位置 n-1 上,因为您从 0 开始迭代。

也在你的内部循环中

for (int x = flag; x <= 1; x--) 

您正在向下迭代,因此您应该比较 x &gt;= 1 而不是 x &lt;= 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 &lt; Given.length(); i++)” - 会说应该。成为for (const auto&amp; i : Given) ...

以上是关于抛出异常:写访问冲突。 _My_data 为 0x7001AC的主要内容,如果未能解决你的问题,请参考以下文章

抛出异常:读取访问冲突。 **dynamicArray** 为 0x1118235。发生了

抛出异常:写访问冲突。 temp 为 nullptr

抛出未处理的异常:读取访问冲突。 x 是 0x20B4112

将“4W2R”转换为“WWWWRR”错误 - 抛出异常:写访问冲突

抛出异常:写访问冲突 C++

DLL代理调用LoadLibrary导致异常:访问冲突读取位置0x00000250