簡體   English   中英

如何解決在引發'std :: logic_error'what()實例之后調用的終止方法what():basic_string :: __ M_construct null無效

[英]how to fix terminate called after throwing an instance of 'std::logic_error' what(): basic_string::_M_construct null not valid

我不確定是什么導致了此問題,我正在創建一個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 :: logic_error'what()實例后調用終止終止:basic_string :: __ M_construct null無效

返回的過程3(0x3)執行時間:0.884 s按任意鍵繼續。

任何幫助表示感謝,謝謝!

TL; DR:

更改

std::string i = 0;

和朋友來

std::string i;

這將產生空字符串。 在使用時,請考慮為字符串提供有意義的標識符,例如inputyes_no 這在以后調試時可能會很有幫助,並且描述性代碼大大減少了對注釋的需求。

問題:

std::string i = 0;

和朋友。

為什么會出現問題:

這是一個初始化,因此調用了構造函數。

std::string沒有可以轉換整數的構造函數,但是它確實有一個構造函數,該構造函數將使用指向字符數組的指針,不幸的是,整數常量0看起來就足夠像NULL指針的舊定義

#define NULL 0

調用它而不是發出編譯器錯誤。

使用NULL指針構造std::string幾乎立即致命,因此string構造函數將其捕獲並引發異常。

std::string i = 1;

沒有這個問題。 編譯器立即拒絕它,因為在1和指針之間沒有歷史等效項,或任何其他可用於初始化string等效項。

邊注:

稍后在代碼中注意checkforwinner (int*gameBoard) 看起來缺少返回類型。 您需要解決此問題,因為該程序未按預期運行。

可能會有編譯器警告。 如果有,請勿忽略警告。 它們是防范邏輯錯誤的第一道防線,因此,如果您希望看到更多警告,則可以在它們變得難以診斷的運行時問題之前對其進行修復。 檢查您的編譯器文檔以了解如何提高警告級別,然后大聲提高警告

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM