Question

Im new to programming and im getting a error that ive never heard of if i press anything past A1 it crashes i get the error “An access violation (Segmentation Fault) raised in your program.” ive almsot completed the program this is stopping me why is it that i can enter A1 but not A2 etc

#include <iostream>
#include <iomanip>
#include <string>
#include <fstream>
#include <stdlib.h>
#include <sstream>
using namespace std;

//function prototype
void fill_array();//fill the array using data from the text file
string Candy_selection[16][4] = {""};//checks array for valid data

int main()
{
string code = "";
string name = "";
double price = 0.0;
double paid = 0.0;
int remaining = 3;
double change = 0.0;
bool item_bought = false;

string convertInt(int number);//converts string to int
fill_array();//fills array


for(int x = 0; x<16; x += 1)
{
    cout << "The codes are "<<Candy_selection[x][0]<<endl;
}

while(code != "E5")
{
    cout << "Enter the candy code: ";//ask for code for candy
    cin >> code;
    int x = 0;
   while(x < 16 && item_bought == false )
    {//checks if code matches up with a valid code
        if(code == Candy_selection[x][0])//if code found
        {
            name = Candy_selection[x][1];//assigns name of candy to name
            price = (double)atof(Candy_selection[x][2].c_str()); //convert to double 
            remaining = (int)atof(Candy_selection[x][3].c_str());//convert to int

            if(remaining != 0)//if there is any of that candy left continue processing
            {
                cout << "You are buying a "<<name<<" The Cost is $"<<price<<endl;//tells how much the candy bar is
                cout << "Please insert money $";
                cin >> paid; 
                if(paid >= price) //makes sure the amount paid is atleast = to the candy bar
                {
                  if(paid > price)
                    {
                        change = paid - price;//calculates change if any
                    } 
                    remaining -= 1; //since candy was bought lowers teh amount remaining by one

                    Candy_selection[x][3] = convertInt(remaining);//converts to string and stores updated value in array

                    cout << fixed <<setprecision(2);
                    cout <<"You have bought a " <<name <<" for $"<<price <<" your change is $"<<change<<endl; 

                }else cout << "you didnt have enough money "<<endl;//not enough paid
            }else cout << "This treat is sold out, please select another"<<endl;//remainder == 0
        }else if(code == Candy_selection[16][0])//if code is not found in array
        {
            cout << "Code not found "<<endl;//code not found
        }
        item_bought = true;//acts as a sentinal value to get out of loop if item is bought
        x+= 1;//moves to next array location

    }
    //reseteting values
    code = "";
    item_bought = false;
    name = "";
    price = 0.0;
    paid = 0.0;
    change = 0.0;
    x = 0;
}
system("pause");
}

void fill_array()//fills array with data from text file
{
    string candy_code = "";
    string candy_name = "";
    string candy_price = "";
    string remaining_candy = "";
    ifstream Candy;     
    Candy.open("Candy.txt");
        if(Candy.is_open() == true)
        {
            while(Candy.eof() == false)
            {

                for(int y = 0;y < 16; y += 1)//puts the data in array then loops on next line then repeats
                {
                    getline(Candy, candy_code, '#');//picking the code name from first field
                    getline(Candy, candy_name, '#');//picking the candy name from second field 
                    getline(Candy, candy_price, '#');//picking the candy price from third field 
                    getline(Candy, remaining_candy, '\n');//picking the candy limit in stalk from 4th field 
                    //puts each entry in the array
                    Candy_selection[y][0] = candy_code;
                    Candy_selection[y][1] = candy_name;
                    Candy_selection[y][2] = candy_price;
                    Candy_selection[y][3] = remaining_candy;

                }
            }
        Candy.close();
        }else cout <<"cannot open data file to sync to array"<<endl;

}
string convertInt(int number)
{
   stringstream ss;//create a stringstream
   ss << number;//add number to the stream
   return ss.str();//return a string with the contents of the stream
}

the text file is as follows

A1#Jelly Beans#1.00#3
A2#Penut butter cup#1.00#3
A3#PB&J#1.00#3
A4#100 Grand bar#1.00#3
B1#Crackers#1.00#3
B2#gum#1.00#3
B3#gummy worm#1.00#3
B4#chocolot bar#1.00#3
C1#Honey bun#1.00#3
C2#Pretzels#1.00#3
C3#Cinnamin bun#1.00#3
C4#gobstocker#1.00#3
D1#pop corn#1.00#3
D2#krabby paddy#1.00#3
D3#chocolot frog#1.00#3
D4#mint#.25#3
Was it helpful?

Solution

code == Candy_selection[16][0]

This is possibly it, you are accessing the 17th element, but you only have 16 elements.

If not you need to search for similar such overflows, null accesses, etc. Run it with a debugger, gdb or visual studio

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top