2

所以我正在尝试创建一个简单的扑克游戏来让自己重新熟悉 C++,因为我已经离开它有一段时间了,想回到 C++。

我遇到了来自 STL 的堆栈问题(合适,不是吗?)。我似乎无法让它允许我向堆栈中添加任何东西。每次我在堆栈对象上调用 push 函数时,它都会引发内存访问冲突......我什至尝试创建一个整数堆栈,并将它们添加到堆栈中,但它仍然会引发内存访问冲突错误。这很奇怪。

当前将对象添加到堆栈的代码是:

//shuffles the deck
void Deck::shuffle()
{
    int index;

    for(int i = 0; i < DECK_SIZE; i++)
    {
        index = (rand() % 52);

        if(deck[index].drawn == false)
        {
            shuffledDeck.push(deck[index]); //throws the error
            deck[index].drawn = true;
        }
        else
        {
            i--;
        }
    }
}

我设置了一个断点,然后沿着兔子洞向下走,发现它在这里抛出了异常:

void push_back(const value_type& _Val)
{   // insert element at end
    this->_Orphan_all();
    _PUSH_BACK_BEGIN;            //EXCEPTION!
    this->_Getal().construct(
    this->_Map[_Block] + _Newoff % _DEQUESIZ, _Val);
    _PUSH_BACK_END;
}

哪个位于 deque.cpp ......这很奇怪。

作为参考,这是我认为可能需要的其余代码:

甲板.cpp

#include "stdafx.h"
#include "Deck.h"
#include <time.h>

using namespace std;
using namespace CardDeck;

const int DECK_SIZE = 52;



CARD deck[DECK_SIZE];
std::stack<CARD> shuffledDeck;



Deck::Deck()
{
    srand((unsigned int)time(NULL));
    loadCards();
}

Deck::~Deck()
{
}

//Draws a card from the deck
CARD Deck::drawCard()
{
    CARD card = shuffledDeck.front();
    shuffledDeck.pop();
    return card;
}

//shuffles the deck
void Deck::shuffle()
{
    int index;

    for(int i = 0; i < DECK_SIZE; i++)
    {
        index = (rand() % 52);

        if(deck[index].drawn == false)
        {
            shuffledDeck.push(deck[index]);
            deck[index].drawn = true;
        }
        else
        {
            i--;
        }
    }
}

    void Deck::loadCards()
    {

        //create input file stream
        ifstream cardList;

        //open the list of cards
        cardList.open("card.txt", ios::in);

        //if the file has opened successfully
        if(cardList.is_open())
        {
            int index = 0;

            //and while the cardlist has data left
            while(cardList.good())
            {
                char * context = NULL;
                CARD card = CARD();
                //read the cards
                string line;
                getline(cardList, line);

                char * s = strtok_s(&line[0], ", ", &context);

                card.value = *s;

                s = strtok_s(NULL, ", ", &context);

                card.suit = s;
                card.drawn = false;

                deck[index] = card;

                index++;
            }
        }

    }

Deck.h(包含 CARD 结构)

#pragma once
#include <string>
#include <stack>
#include <fstream>
#include <sstream>
#include <iostream>
#include <string>

namespace CardDeck
{
    struct CARD
    {
        public:
            std::string suit;
            char value;
            bool drawn;

            CARD(){}

            CARD(const CARD& card)
            {
                suit = card.suit;
                value = card.value;
                drawn = card.drawn;
            }

            CARD& operator= (const CARD& card)
            {
                suit = card.suit;
                value = card.value;
                drawn = card.drawn;

                return *this;
            }
    };

        class Deck
        {
            public:
                Deck();
                ~Deck();
                Deck(const Deck& deck);
                CARD drawCard();
                void shuffle();

            private:
                void loadCards();

        };
    }
4

1 回答 1

4

您可能正在写入超出deck数组末尾的内容loadCards(),从而破坏了内存。

即使你正好有 52 行数据,cardlist.good()也会返回true直到一个指示之后。EOF

您可能想尝试以下循环(未经测试):

string line;
while(getline(cardList, line) && (index < 52))
{
    char * context = NULL;
    CARD card = CARD();

    char * s = strtok_s(&line[0], ", ", &context);

    card.value = *s;

    s = strtok_s(NULL, ", ", &context);

    card.suit = s;
    card.drawn = false;

    deck[index] = card;

    index++;
}
于 2012-11-20T02:06:45.000 回答