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

时间:2017-11-08 10:34:34

标签: c++

  

在whileLTestStr.exe中0x008F1D0D处抛出异常:0xC0000005:访问冲突写入位置0x00770000。

在尝试将一个字符从一个数组放入另一个数组时,运行时会出现此错误。

输入字符串后立即发生错误,它不会关闭程序,只是“暂停”它。

#include "stdafx.h"
#include <iostream>
#include <cstring>

int main()
{
    using namespace std;

    char test[20];
    char result[20];
    int i = 0;

    cout << "Enter a string without symbolic characters: ";
    cin.get(test, 20);

    for (i; (test[i] != '?' || test[i] != '\0'); i++)
    {
        result[i] = test[i];    //Exception gets thrown here
    }

    if (strcmp(result, test) != 0)
    {
        cout << "Fail.";
    }
    else
    {
        cout << result << endl;
        cout << "Success.";
    }

    return 0;
}

我已经用注释标出了抛出异常的位置。

此程序仅用于限制用户可以输入的内容,仅用于测试。但我不明白为什么这不起作用。

可能有一些功能可以帮我这么做,但是我还在学习这门语言,我只是想尝试和测试我可以用循环等做什么。

修改

在建议之后我更改了AND运算符的OR运算符,我不再收到错误。但是,我确实得到了一些非常奇怪的行为。

PICTURE

2 个答案:

答案 0 :(得分:3)

test[i] != '?' || test[i] != '\0'始终为true,因此您最终会越过数组的边界,因为i++增量太远。

您是否想要&&代替||

最后,您需要向result插入显式NUL终止符,否则输出将是未定义的。一种简单的方法是使用

将数组初始化为\0的数组
char result[20] = {};

答案 1 :(得分:0)

#include <iostream>
#include <string>
#include <algorithm>

int main()
{
    using namespace std;

    string test;

    cout << "Enter a string without symbolic characters: ";
    getline(cin, test);

    if (test.find("?") != string::npos )
    {
        cout << "Fail.";
    }
    else
    {
        cout << test << endl;
        cout << "Success.";
    }
}

你可以用std :: string来做到这一点。学习C ++,而不是C。