C++ 访问冲突读取位置c++;

C++ 访问冲突读取位置c++;,c++,C++,我正在写一个程序,打印用户输入的号码的英文全名。这不是一个完整的程序,但我不断收到一个错误: 编程挑战14.1.exe中0x00b02c76处的首次机会异常:0xC0000005:访问冲突读取位置0xCCCD80。 编程挑战14.1.exe中0x00b02c76处的未处理异常:0xC0000005:访问冲突读取位置0xCCCD80 我试着四处看看,却找不到任何对我有用的东西。以下是节目: 头文件: #ifndef NUMBERS_H #define NUMBERS_H #include <

我正在写一个程序,打印用户输入的号码的英文全名。这不是一个完整的程序,但我不断收到一个错误:

编程挑战14.1.exe中0x00b02c76处的首次机会异常:0xC0000005:访问冲突读取位置0xCCCD80。 编程挑战14.1.exe中0x00b02c76处的未处理异常:0xC0000005:访问冲突读取位置0xCCCD80

我试着四处看看,却找不到任何对我有用的东西。以下是节目:

头文件:

#ifndef NUMBERS_H
#define NUMBERS_H

#include <string>

using namespace std;
const int SIZE1 = 18;
const int SIZE2 = 8;

class Numbers
{
private:
    int number;
    string hundred;
    string thousand;
    string * one;
    string * ten;


public:
    Numbers(int num)
    {
        number = num;
        hundred = "hundred";
        thousand = "thousand";
        string * one = new string[SIZE1];
        string * ten = new string[SIZE2];
    }

    void initializeArray()
    {
        // Intialize array "one"
        one[0] = "zero";
        one[1] = "one";
        one[2] = "two";
        one[3] = "three";
        one[4] = "four";
        one[5] = "five";
        one[6] = "six";
        one[7] = "seven";
        one[8] = "eight";
        one[9] = "nine";
        one[10] = "eleven";
        one[11] = "twelve";
        one[12] = "thirteen";
        one[13] = "fourteen";
        one[14] = "fifteen";
        one[15] = "sixteen";
        one[16] = "seventeen";
        one[17] = "eighteen";
        one[18] = "nineteen";

        // Initialize the ten array

        ten[0] = "ten";
        ten[1] = "twenty";
        ten[2] = "thirty";
        ten[3] = "forty";
        ten[4] = "fifty";
        ten[5] = "sixty";
        ten[6] = "seventy";
        ten[7] = "eighty";
        ten[8] = "ninety";  
    }

    string determine()
    {
        string name = "";

        for (int i = 0; i <= number; i++)
        {
            if (number == i)
            {
                name = one[i];
            }
        }

        return name;
    }

    ~Numbers()
    {
        delete [] one;
        delete [] ten;
    }
};

#endif
\ifndef编号\u H
#定义数字
#包括
使用名称空间std;
常数int SIZE1=18;
常数int SIZE2=8;
班级人数
{
私人:
整数;
串百;
串千;
字符串*1;
字符串*10;
公众:
数字(整数)
{
number=num;
百=“百”;
千=“千”;
string*one=新字符串[SIZE1];
string*ten=新字符串[SIZE2];
}
void initializeArray()
{
//初始化数组“一”
一[0]=“零”;
一[1]=“一”;
一[2]=“两”;
一[3]=“三”;
一[4]=“四”;
一[5]=“五”;
一[6]=“六”;
一[7]=“七”;
一[8]=“八”;
一[9]=“九”;
一[10]=“十一”;
一[11]=“十二”;
一[12]=“十三”;
一[13]=“十四”;
一[14]=“十五”;
一[15]=“十六”;
一[16]=“十七”;
一[17]=“十八”;
一[18]=“十九”;
//初始化十个数组
十[0]=“十”;
十[1]=“二十”;
十[2]=“三十”;
十[3]=“四十”;
十[4]=“五十”;
十[5]=“六十”;
十[6]=“七十”;
十[7]=“八十”;
十[8]=“九十”;
}
字符串确定()
{
字符串名称=”;

对于(inti=0;i
一个
包含18个元素,但您将19个元素放在其中

const int SIZE1 = 18;
大小为
SIZE1
的数组的有效数组索引为0到17。通常,大小为N的数组的有效索引为0到N-1

我建议在这里使用
std::vector

两件事:

您根本没有调用“initializeArray()”。因此,当您尝试访问数组时,数组中没有任何内容。我建议您在构造函数中调用它。如下所示:

Numbers(int num)
{
    number = num;
    hundred = "hundred";
    thousand = "thousand";
    one = new string[SIZE1];
    ten = new string[SIZE2];
    initializeArray();
}
第二,是上面的人所说的。你的数组大小的值不正确,因为你试图为一个大小为18的数组分配19个值。为了确保大小比我们预期的大,你可以稍后进行调整:

const int SIZE1 = 20;
const int SIZE2 = 20;
此外,请参阅determine()?与其使用for循环,不如执行以下操作:

string name = one[number];
编辑:哇,我还漏掉了一件事……你已经声明了两次数组指针变量,因此它实际上超出了范围,认为你想制作一些本地版本。再看看我上面调整的构造函数实现。看看我是如何从变量名前删除“字符串*”。

变量“一”和“十”已从字符串指针更改为包含字符串的向量。在构造函数中称为initializeArray。更改了将名称字符串分配给新字符串的方式。以下是工作代码

class Numbers
{
private:
    int number;
    string hundred;
    string thousand;
    vector<string> one;
    vector<string> ten;


public:
    Numbers(int num)
    {
        number = num;
        hundred = "hundred";
        thousand = "thousand";
        initializeArray();
    }

    void initializeArray()
    {

        one.push_back("zero");
        one.push_back("one");
        one.push_back( "two");
        one.push_back("three");
        one.push_back("four");
        one.push_back("five");
        one.push_back("six");
        one.push_back("seven");
        one.push_back("eight");
        one.push_back("nine");
        one.push_back("eleven");
        one.push_back("twelve");
        one.push_back("thirteen");
        one.push_back("fourteen");
        one.push_back("fifteen");
        one.push_back("sixteen");
        one.push_back("seventeen");
        one.push_back("eighteen");
        one.push_back("nineteen");

        // Initialize the ten array

        ten.push_back("ten");
        ten.push_back("twenty");
        ten.push_back("thirty");
        ten.push_back("forty");
        ten.push_back("fifty");
        ten.push_back("sixty");
        ten.push_back("seventy");
        ten.push_back("eighty");
        ten.push_back("ninety");  
    }

    string determine()
    {
        string name("");
        for (int i = 0; i <= number; i++)
        {
            if (number == i)
            {
               auto iter = one.begin();
               iter += i;
               name.assign(*iter);
            }
        }

        return name;
    }

    ~Numbers()
    {

    }
};


int main()
{

    Numbers n(5);
    string name = n.determine();

    cout << "The number is " << name << endl;

    cin.ignore();
    cin.get();

    return 0;
}
类号
{
私人:
整数;
串百;
串千;
向量一;
向量10;
公众:
数字(整数)
{
number=num;
百=“百”;
千=“千”;
初始化array();
}
void initializeArray()
{
一、推回(“零”);
一、推回(“一”);
一、推回(“两”);
一、推回(“三”);
一、推回(“四”);
一、推回(“五”);
一、推回(“六”);
一、推回(“七”);
一、推回(“八”);
一、推回(“九”);
一、推回(“十一”);
一、推回(“十二”);
一、推回(“十三”);
一、推回(“十四”);
一、推回(“十五”);
一、推回(“十六”);
一、推回(“十七”);
一、推回(“十八”);
一、推回(“十九”);
//初始化十个数组
十、推回(“十”);
十、推回(“二十”);
十、推回(“三十”);
十、推回(“四十”);
十、推回(“五十”);
十、推回(“六十”);
十、推回(“七十”);
十、推回(“八十”);
十、推回(“九十”);
}
字符串确定()
{
字符串名(“”);

对于(int i=0;我真不敢相信我错过了。非常感谢你们两个,我会看看它是否有效。我提出了你们的建议,但它仍然不断地向我抛出错误。想看看编辑过的代码吗?也许我错过了什么?嗯,让我编辑我的答案,以确保我们都在同一页上。好的,你在构造函数中告诉我的也是这样,至于不包括if/else语句的赋值,对吗?我一直在得到错误,你认为可能是我错误地实现了析构函数吗?事实上,我理解你修改determine的意思。我还发现了另一个问题…在我的编辑中注意到。只需将它加载到我的编译器中,它就工作了:)哦,哇,我不太熟悉向量,我只知道它们的基本功能和用途,但我不熟悉auto-iter=one.begin();iter+=i;name.assign(*iter);为什么不使用字符串向量?
class Numbers
{
private:
    int number;
    string hundred;
    string thousand;
    vector<string> one;
    vector<string> ten;


public:
    Numbers(int num)
    {
        number = num;
        hundred = "hundred";
        thousand = "thousand";
        initializeArray();
    }

    void initializeArray()
    {

        one.push_back("zero");
        one.push_back("one");
        one.push_back( "two");
        one.push_back("three");
        one.push_back("four");
        one.push_back("five");
        one.push_back("six");
        one.push_back("seven");
        one.push_back("eight");
        one.push_back("nine");
        one.push_back("eleven");
        one.push_back("twelve");
        one.push_back("thirteen");
        one.push_back("fourteen");
        one.push_back("fifteen");
        one.push_back("sixteen");
        one.push_back("seventeen");
        one.push_back("eighteen");
        one.push_back("nineteen");

        // Initialize the ten array

        ten.push_back("ten");
        ten.push_back("twenty");
        ten.push_back("thirty");
        ten.push_back("forty");
        ten.push_back("fifty");
        ten.push_back("sixty");
        ten.push_back("seventy");
        ten.push_back("eighty");
        ten.push_back("ninety");  
    }

    string determine()
    {
        string name("");
        for (int i = 0; i <= number; i++)
        {
            if (number == i)
            {
               auto iter = one.begin();
               iter += i;
               name.assign(*iter);
            }
        }

        return name;
    }

    ~Numbers()
    {

    }
};


int main()
{

    Numbers n(5);
    string name = n.determine();

    cout << "The number is " << name << endl;

    cin.ignore();
    cin.get();

    return 0;
}