为什么我一直收到这个错误:异常未处理:引发未处理的异常:读取访问冲突.这是0x4



我目前正在进行BlackJack项目,但有一个错误显示"exception Unhandled:引发未处理的异常:读取访问冲突。这是0x4;。我不太确定我做错了哪一部分,程序有时正常运行,有时显示异常。在draw_card函数中,它返回一个随机数的值。例如:如果我们得到13,则值将为10。它还返回卡的名称和卡的类型,例如13对应于国王。

int main()
{
srand(time(0));
unsigned bet;
int player = 0 , dealer = 0;
string card , type;
cout << "You have $100. Enter bet: ";
cin >> bet;

cout << "Your cards are:" << endl; 
player += draw_card(card, type, player);
cout << "  "+card + " of " + type << endl;
player += draw_card(card, type, player);
cout << "  " + card + " of " + type << endl << endl << endl;
}
int draw_card(string& card, string& type, int drawer_points) {
int randomNumber;  //between 1 and 13
int suite;         //between 1 and 4 to determine the suite of the card.
randomNumber = rand() % 13 + 1;
suite = rand() % 4 + 1;

card = getRank(randomNumber);
type = getSuit(suite);
if (randomNumber == 13 || randomNumber == 12 || randomNumber == 11) {
return 10;
}else if (randomNumber == 1) {
int ace1 = 21 - (drawer_points + 1);
int ace2 = 21 - (drawer_points + 11);
return ace1 < ace2 ? 1 : 11;
}
else
{
return randomNumber;
}
}

string getSuit(int suit) {

switch (suit)
{
case 0:
return "spades";
break;
case 1:
return "clubs";
break;
case 2:
return "diamonds";
break;
case 3:
return "hearts";
break;
default:
break;
}

}
string getRank(int rank) {
switch (rank)
{
case 13:
return "King";
break;
case 12:
return "Queen";
break;
case 11:
return "Jack";
break;
case 1:
return "Ace";
break;
case 2:
return "Two";
break;
case 3:
return "Three";
break;
case 4:
return "Four";
break;
case 5:
return "Five";
break;
case 6:
return "Six";
break;
case 7:
return "Seven";
break;
case 8:
return "Eight";
break;
case 9:
return "Nine";
break;
case 10:
return "Ten";
break;
default:
break;
}

您生成

suite = rand() % 4 + 1;

这是一个介于1和4之间的随机数。

然后你打电话给

getSuit(suite);

但是getSuit只有0和3之间(包括0和3(值的切换分支:

switch (suit)
{
case 0:
return "spades";
break;
case 1:
return "clubs";
break;
case 2:
return "diamonds";
break;
case 3:
return "hearts";
break;
default:
break;
}

不从声明为返回值的函数返回值是未定义的行为。

如果只执行switch语句的默认情况,代码中的一些函数(如getSuitgetRank(不会返回值。

在默认情况下,您可以返回一个空字符串:

default:
return ""; // empty string

在调用站点中,使用empty函数检查返回值是否为空。

另一种方法是使用std::optional<T>,如下所示:

std::optional<string> getSuit( const int suit )
{
switch (suit)
{
case 0:
return "spades";
case 1:
return "clubs";
case 2:
return "diamonds";
case 3:
return "hearts";
default:
return { }; // empty optional
}
}

在呼叫站点:

std::optinal<std::string> type { getSuit(suite) };
if ( type ) // if optional has value
{
// extract and use the value inside of optional
type.value( );
}

请记住,如果可选项没有值,则使用value()将抛出。您可以使用不抛出的value_or()

相关内容

最新更新