Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何修复在抛出';标准::逻辑错误';what():基本\u字符串::\u M\u构造null无效_C++ - Fatal编程技术网

C++ 如何修复在抛出';标准::逻辑错误';what():基本\u字符串::\u M\u构造null无效

C++ 如何修复在抛出';标准::逻辑错误';what():基本\u字符串::\u M\u构造null无效,c++,C++,我不确定是什么原因导致了这个问题,我正在创建一个tic-tac-toe游戏,你可以在其中与计算机进行游戏 我什么都没试过,因为我不知道这个错误是什么意思 #include <cstdio> #include <cstdlib> #include <iostream> #include <cmath> #include <time.h> using namespace std; void InitializeBoard(int *ga

我不确定是什么原因导致了这个问题,我正在创建一个tic-tac-toe游戏,你可以在其中与计算机进行游戏

我什么都没试过,因为我不知道这个错误是什么意思

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <time.h>

using namespace std;

void InitializeBoard(int *gameBoard);
void InitializeTurns(int &whosturnisit,int &turnsTaken);
void InitializegameBoard (int *gameBoard);
void DrawScreen (int *gameBoard);
void taketurnplayer(int *gameBoard,int &turnsTaken,int &whosturnisit);
void taketurncomputer(int *gameBoard,int turnsTaken,int whosturnisit);
int checkforwinner(int *gameBoard);
void displayWinner (int &whoWins);


int main()
{
int gameBoard[10];
int whosturnisit, turnsTaken, whoWins;

    InitializeTurns(whosturnisit,turnsTaken);
    InitializegameBoard(gameBoard);
    DrawScreen (gameBoard);

    do
        {
        if (whosturnisit==1)
            taketurnplayer(gameBoard,turnsTaken,whosturnisit);
        else
            taketurncomputer(gameBoard,turnsTaken,whosturnisit);
        DrawScreen(gameBoard);
        whoWins=checkforwinner(gameBoard);
        }while (  (turnsTaken<9) && (whoWins==0) );
    displayWinner(whoWins);
    return 99;
}

void InitializegameBoard (int *gameBoard)
{
    for (int i=0;i<=9;i++)
    gameBoard[i]=0;
return;
}

void InitializeTurns(int &whosturnisit, int &turnsTaken)
{
    string i=0;
    whosturnisit=0;
    turnsTaken=0;
    cin>>i;
    if (i=="yes")
        whosturnisit=1;
    else
        whosturnisit=2;
return;
}

void DrawScreen(int *gameBoard)
{
    system("cls");
    for (int i=1;i<11;i++)
    cout<<gameBoard[i];
return;
}

void taketurnplayer(int *gameBoard,int &turnsTaken,int &whosturnisit)
{
    int x=0;
    do
    {
    cout<<"where would u like to place your x";
    cin>>x;
    }while (gameBoard[x]!=0);
    gameBoard[x]=1;
    whosturnisit=2;
    turnsTaken++;
    return;
}
void taketurncomputer(int*gameBoard, int turnsTaken, int whosturnisit)
{
    int spot=0;
    do
    {
        spot=1+(std::rand()%(9-1+1));
    }while (gameBoard[spot]!=0);
    gameBoard[spot]=2;
    whosturnisit=1;
    turnsTaken++;
    return;
}
checkforwinner (int*gameBoard)
{
    int thewinneris=0;
    if((gameBoard[1]==gameBoard[2])&&(gameBoard[2]==gameBoard[3])&&(gameBoard[3]!=0))
        thewinneris=gameBoard[1];
    else if ((gameBoard[4]==gameBoard[5])&&(gameBoard[5]==gameBoard[6])&&(gameBoard[6]!=0))
        thewinneris=gameBoard[4];
    else if ((gameBoard[7]==gameBoard[8])&&(gameBoard[8]==gameBoard[9])&&(gameBoard[9]!=0))
        thewinneris=gameBoard[7];
    else if ((gameBoard[1]==gameBoard[5])&&(gameBoard[5]==gameBoard[9])&&(gameBoard[9]!=0))
        thewinneris=gameBoard[1];
    else if ((gameBoard[2]==gameBoard[5])&&(gameBoard[5]==gameBoard[8])&&(gameBoard[8]!=0))
        thewinneris=gameBoard[2];
    else if ((gameBoard[1]==gameBoard[4])&&(gameBoard[4]==gameBoard[7])&&(gameBoard[7]!=0))
        thewinneris=gameBoard[1];
    else if ((gameBoard[3]==gameBoard[6])&&(gameBoard[6]==gameBoard[9])&&(gameBoard[9]!=0))
        thewinneris=gameBoard[3];
    else if ((gameBoard[3]==gameBoard[5])&&(gameBoard[5]==gameBoard[7])&&(gameBoard[7]!=0))
        thewinneris=gameBoard[3];
        return thewinneris;
}
void displayWinner(int &whoWins)
{
    cout<<whoWins;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
无效初始化板(int*游戏板);
无效初始化turns(int和whosturnisit、int和turnsTaken);
无效初始化游戏板(int*游戏板);
无效抽屏(int*gameBoard);
void taketurnplayer(int*gameBoard,int&turnsTaken,int&whosturnisit);
void taketurncomputer(int*gameBoard、int turnsTaken、int Whosurnisit);
int checkforwinner(int*游戏板);
void displayWinner(int和whoWins);
int main()
{
int gameBoard[10];
在whosturnisit,turnsTaken,whoswins;
初始化Turns(whosturnisit、turnsTaken);
初始化游戏板(游戏板);
牵引屏(游戏板);
做
{
如果(whosurnisit==1)
taketurnplayer(游戏板、turnsTaken、whosturnisit);
其他的
taketurncomputer(游戏板、turnsTaken、Whosurnisit);
牵引屏(游戏板);
whoWins=checkforwinner(游戏板);
}而(特恩斯塔基尼,;
如果(i=“是”)
whosturnisit=1;
其他的
whosturnisit=2;
返回;
}
无效抽屏(int*gameBoard)
{
系统(“cls”);
对于(int i=1;iTL;DR:
改变

std::string i = 0;
朋友们

std::string i;

这将产生空字符串。当您在其中时,考虑给字符串一个有意义的标识符,如“代码>输入< /COD>”或“代码> YESYNO.< /代码>。这将在以后调试时有很大帮助,并且描述性代码极大地减少了对注释的需要。

问题是: 还有朋友

为什么这是一个问题: 这是一个初始化,因此调用构造函数

std::string
没有可以转换整数的构造函数,但它确实有一个可以获取指向字符数组的指针的构造函数,不幸的是,0的整数文本看起来很像
NULL
指针的旧定义

#define NULL 0
调用它而不是发出编译器错误

用空指针构造
std::string
几乎是致命的,因此
string
构造函数会捕获它并抛出异常

std::string i = 1;
没有此问题。编译器会立即拒绝它,因为1与指针或任何其他可用于初始化
字符串的对象之间没有历史等价性

旁注: 稍后在代码中注意
checkforwinner(int*gameBoard)
。返回类型似乎丢失。您需要修复此问题,因为程序未按预期运行


可能会有编译器警告。如果有,请不要忽略警告。警告是防止逻辑错误的第一道防线,因此,如果您希望看到更多警告,以便在它们变得难以诊断运行时问题之前修复它们。请查看编译器文档,了解如何提高警告级别,然后查看cra大声把它挂起来!

string i=0;
是错误的。它试图使用
NULL
指针初始化
std::string
,这是非法的。只要不初始化它,你无论如何都会用用户输入覆盖任何内容:
std::string i;
谢谢你的工作。现在一切都好了。谢谢你提供的所有信息,我会修复的d所有这些和它的启动和运行非常感谢你!
std::string i = 1;