You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++二十一点项目中srand报错需要存储类是什么原因?

核心错误原因

srand(time(NULL))是可执行语句,不能放在全局作用域。C/C++的全局作用域仅支持变量、函数的声明/定义,不允许直接编写运行时执行的逻辑,编译器会误将该语句识别为函数声明,因此抛出「需要存储类」的报错。

修复方法

  1. 将srand(time(NULL))和随机手牌的初始化逻辑移动到main函数的最开头
  2. 修复手牌点数累加逻辑的bug:原逻辑每次循环都会累加历史值,会导致点数计算错误,每次计算前需要先重置点数变量为0
  3. 逻辑判断符or部分编译器不原生支持,替换为更通用的||

修正后可运行的代码

#include <iostream>
#include <vector>
#include <cstdlib>
#include <time.h>
using namespace std;
vector<int> handone(0);
vector<int> handtwo(0);
int handone_int = 0;
int handtwo_int = 0;
string n = "Yes";

int main() {
    // 随机数种子初始化放到main开头
    srand(time(NULL));
    int starting_hand = rand() % 21 + 1;
    int starting_hand_two = rand() % 21 + 1;

    cout << "Welcome To BlackJack! ";
    cout << "Your starting hand is " << starting_hand << "\n";
    while (handone_int < 21 && handtwo_int < 21) {
        // 每次计算前先重置点数,避免重复累加
        handone_int = 0;
        handtwo_int = 0;
        for (int i = 0; i < handone.size(); i++) {
            handone_int = handone_int + handone[i];
        } 
        for (int i = 0; i < handtwo.size(); i++) {
            handtwo_int = handtwo_int + handtwo[i];
        }
        cout << "Would you like to keep or hold? ";
        cin >> n; 
        if (n == "keep" || n == "Keep") {
            // 后续抽牌逻辑可在此补充
        }
    }   
    return 0;
}

内容的提问来源于stack exchange,提问作者Maxon Baisley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 21:06:07