toegangsschending leeslocatie c++

Ik ben een programma aan het schrijven dat de volledige Engelse naam afdrukt van het nummer dat door de gebruiker is ingevoerd. het is geen compleet programma, maar ik krijg steeds een foutmelding:

Uitzondering bij eerste kans op 0x00b02c76 in programmeeruitdaging 14.1.exe: 0xC0000005: leeslocatie voor toegangsfout 0xcccccd80.
Niet-verwerkte uitzondering op 0x00b02c76 in programmeeruitdaging 14.1.exe: 0xC0000005: leeslocatie voor toegangsfout 0xcccccd80.

Ik heb geprobeerd rond te kijken en kon niets vinden dat voor mij van nut was. hier dit het programma:

headerbestand:

#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

en dit is het hoofdprogramma, ik gebruik alleen een constructor om een waarde aan een getal toe te kennen om het debuggen een beetje sneller te maken

#include <iostream>
#include "Numbers.h"
using namespace std;
int main()
{
    Numbers n(5);
    string name = n.determine();
    cout << "The number is " << name << endl;
    cin.ignore();
    cin.get();
    return 0;
}

dit is trouwens vc++ voor de compiler

zal geen vragen beantwoorden, want dit is niet echt te georganiseerd


Antwoord 1, autoriteit 100%

Twee dingen hier:

Je roept “initializeArray()” helemaal niet aan. Dus wanneer u toegang probeert te krijgen tot de array, is er niets. Ik zou aanraden om het in de constructor te noemen. Zoals dit:

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

Ten tweede, is wat de jongens hierboven zeiden. Je hebt een onjuiste waarde voor de grootte van je array omdat je 19 waarden probeert toe te kennen aan een array van grootte 18. Laten we voor de zekerheid de grootte groter maken dan we verwachten en je kunt het later aanpassen:

const int SIZE1 = 20;
const int SIZE2 = 20;

Bovendien, zie je bepalen()? in plaats van een for-lus te gebruiken, waarom ga je niet:

string name = one[number];

EDIT: Wow, er was nog iets dat ik over het hoofd zag… je hebt je array pointer-variabele twee keer gedeclareerd en dus gaat het buiten bereik omdat je denkt dat je een aantal lokale versies wilt maken. Kijk nog eens naar mijn aangepaste implementatie van uw constructor hierboven. Kijk hoe ik de “String *” heb verwijderd van vóór de variabelenamen.


Antwoord 2, autoriteit 91%

const int SIZE1 = 18;

Geldige array-index voor de array van SIZE1zijn 0 tot 17. Over het algemeen zijn geldige indexen voor een array van grootte N0naar N-1.

Ik raad aan om std::vector<std::string>te gebruiken.


Antwoord 3, autoriteit 99%

onebevat 18 elementen, maar je plaatst er 19 elementen in.


Antwoord 4

De variabelen “één” en “tien” zijn gewijzigd van tekenreeksaanwijzers in vectoren met tekenreeksen. Riep de initializeArray binnen de constructor. De manier gewijzigd waarop de naamstring werd toegewezen aan de nieuwe string. Hier is de werkende code.

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;
}

Other episodes