2013-04-28 112 views
3

经过研究,我相信我明白"Segmentation fault"错误是什么。但是,即使在逐行注释代码之后,我似乎也无法找到故障发生的位置以便解决问题。有没有我忽略的是导致这个错误?下面是当我运行代码时显示的内容:分割错误(核心转储)C++

准备玩(y/n)? ÿ

3C AH 4C 3H 4H 2H 5H 2C 5C AC

这里是您的卡:3C AH 4C 3H 4H

分段故障(核心转储)

粘贴下面是代码我指的是。注释掉的部分只是我试图找到其中的错误发生在:

#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <sstream> 
#include <ctime> 
#include <cstdlib> 
#include <string> 
#include <cstring> 
#include <stdio.h> 
using namespace std; 

vector<string> bigDeck; 
vector<string> cardDeck; 
vector<string> playerHand; 
vector<string> computerhand; 
vector<string> shortvec; 

const int DEAL_CARDS = 5; 


void ResetDeck(); 
void Shuffle(); 
void DealACard(); 
void DealQCard(); 
void DealBCard(); 
string CStr(int); 
int letsee2; 

int main() 
{ 


cout << "Ready to play (y/n)? "; 

char yn; 
cin >> yn; 
if (yn == 'n' || yn != 'y') return 0; 

ResetDeck(); 

srand(time(0)); 

Shuffle(); 

for (int f=0; f < 10; f++) 
{ 
     cout << cardDeck[f] << " "; 
} 


cout << "\n\nHere's your cards: "; 
for (int i=0; i < DEAL_CARDS; i++) 
{ 
     DealACard(); 
     cout << playerHand[i] << " "; 
} 

cout<<"\n\nHere's the Computer's cards: "; 
for (int k=0; k < DEAL_CARDS; k++) 
{ 
     DealBCard(); 
     cout << computerhand[k] << " "; 
} 

for (int u=0; u < DEAL_CARDS; u++) 
{ 
     DealQCard(); 
} 

cout<<shortvec.size()<<endl; 

cout<<endl<<endl; 

//do 
//{ 

for (int woh=0; woh < DEAL_CARDS; woh++) 
{ 
if ((playerHand[woh][0]=='A') && (computerhand[woh][0]=='A')) 
     { 
       cout<<"War!"<<endl; 


     } 
     else if ((playerHand[woh][0]=='A') && (computerhand[woh][0]!='A')) 
     { 
       cout<<"Player wins"<<endl; 
       /*playerHand.push_back(computerhand[woh]); 
       computerhand.erase(computerhand.begin()+(woh-1));*/ 
     } 
     else if ((playerHand[woh][0]!='A') && (computerhand[woh][0]=='A')) 
     { 
       cout<<"Computer Wins"<<endl; 
       /*computerhand.push_baci(playerHand[woh]); 
       playerHand.erase(playerHand.begin()+(woh-1));*/ 
     } 
     else 
     { 
       if ((atoi(playerHand[woh].c_str())) > (atoi(computerhand[woh].c_str()))) 
       { 
         cout<<"Player wins!"<<endl; 
         /*playerHand.push_back(computerhand[woh]); 
         computerhand.erase(computerhand.begin()+(woh-1));*/ 
       } 
       else if ((atoi(playerHand[woh].c_str())) < (atoi(computerhand[woh].c_str()))) 
       { 
         cout<<"Computer wins!"<<endl; 
         /*computerhand.push_back(playerHand[woh]); 
         playerHand.erase(playerHand.begin()+(woh-1));*/ 
       } 
       else 
       { 
         cout<<"War!"<<endl; 

       } 
     } 
/*if (playerHand.size() > computerhand.size()) 
     shortvec = computerhand; 
else 
     shortvec = playerHand; 

cout<<endl<<endl; 
*/ 
} 
/*for (int z=0; z < playerHand.size(); z++) 
{ 
     cout << playerHand[z] << " "; 
} 

cout<<"\n\nHere's the Computer's cards: "; 
for (int y=0; y < computerhand.size(); y++) 
{ 
     cout << computerhand[y] << " "; 
}*/ 

cout<<endl<<endl; 
//} 
//while(((playerHand.size())!=10) || (computerhand.size())!=10); 

return 0; 
} 
void Shuffle() 
{ 
     random_shuffle(cardDeck.begin(),cardDeck.end()); 
} 

void DealBCard() 
{ 
     computerhand.push_back(cardDeck[0]); 
     cardDeck.erase(cardDeck.begin()); 
} 

void DealACard() 
{ 
     playerHand.push_back(cardDeck[0]); 
     cardDeck.erase(cardDeck.begin()); 
} 

void DealQCard() 
{ 
     shortvec.push_back(bigDeck[0]); 
     bigDeck.erase(bigDeck.begin()); 
} 

string CStr(int n) 
{ 
     stringstream s; 
     s << n; 
     return s.str(); 
} 

void ResetDeck() 
{ 
     cardDeck.clear(); 
     playerHand.clear(); 
     computerhand.clear(); 

     for (int i=2; i<6; ++i) 
     { 
       cardDeck.push_back(CStr(i) + "H"); 
       cardDeck.push_back(CStr(i) + "C"); 
     } 
     cardDeck.push_back("AH"); 
     cardDeck.push_back("AC"); 
} 

回答

4

您有一个名为std::vectorbigDeckDealQCard尝试,访问它的第0个元素,尽管它没有元素的事实。你的意思是把一些卡放在bigDeck

+0

就是这样!非常感谢。我只有那个矢量,因为我试图找出一种方式来循环游戏的时间等于最小的矢量长度(计算机长度与玩家的长度)......我相信我会在一个圆周左右进行游戏。但是谢谢!这摆脱了分段故障。 – user2330291 2013-04-28 23:44:58

2

尝试访问其他进程正在使用的不存在的内存或内存也会导致分段错误(核心转储)。

核心转储意味着程序状态已被记录,即它的资源在内存和处理器中。