簡體   English   中英

C++ cout 打印二維字符數組的全部內容

[英]C++ cout prints entire contents of 2D char array

我正在寫一個井字游戲來學習 C++。

我想將游戲板存儲在 2D 字符數組中:

    char playerBoard[5][14] {
        {'2',' ','>',' ','_',' ','|',' ','_',' ','|',' ','_','\n'},
        {'1',' ','>',' ','_',' ','|',' ','_',' ','|',' ','_','\n'},
        {'0',' ','>',' ','_',' ','|',' ','_',' ','|',' ','_','\n'},
        {' ',' ',' ',' ','^',' ',' ',' ','^',' ',' ',' ','^','\n'},
        {' ',' ',' ',' ','0',' ',' ',' ','1',' ',' ',' ','2','\n'}
    };

我想用 cout 打印數組:

    for (int i = 0; i < 5; i++) {
            cout << playerBoard[i];
        }

當我嘗試時,從第一個數組開始的playerboard的全部內容在每次迭代時都會打印出來:


    2 > _ | _ | _
    1 > _ | _ | _
    0 > _ | _ | _
        ^   ^   ^
        0   1   2
    1 > _ | _ | _
    0 > _ | _ | _
        ^   ^   ^
        0   1   2
    0 > _ | _ | _
        ^   ^   ^
        0   1   2
        ^   ^   ^
        0   1   2
        0   1   2

playerBoard 的全部內容打印為:

    cout << playerBoard[0];

這里發生了什么?

您的五個數組子元素都不是以nul結尾的字符串(可能最后一個除外,但這依賴於未定義的行為)。

帶有char*操作數(或char[]操作數,衰減char* )的std::cout <<操作假定以nul結尾的字符串; 在您的情況下,由於缺少終止符,因此會打印緩沖區,直到在某處找到一個為止。 這似乎是在整個數組塊之后。

要解決此問題,請將子數組的大小增加到 15 個字符並添加所需的nul (零)終止符:

int main()
{
    char playerBoard[5][15]{
        {'2',' ','>',' ','_',' ','|',' ','_',' ','|',' ','_','\n','\0'},
        {'1',' ','>',' ','_',' ','|',' ','_',' ','|',' ','_','\n','\0'},
        {'0',' ','>',' ','_',' ','|',' ','_',' ','|',' ','_','\n','\0'},
        {' ',' ',' ',' ','^',' ',' ',' ','^',' ',' ',' ','^','\n','\0'},
        {' ',' ',' ',' ','0',' ',' ',' ','1',' ',' ',' ','2','\n','\0'}
    };
    for (int i = 0; i < 5; i++) {
        std::cout << playerBoard[i];
    }
    return 0;
}

你有未定義的行為,因為std::cout << playerBoard[i]; 期望playerBoard[i]是(指向第一個元素的) null 終止數組,並且沒有 null 字符( char{0} )。

要解決此問題,請使用適用於非空終止字符 arrays std::cout.write(s, count)std::string_view string_view:

for (int i = 0; i < 5; i++) {
    std::cout.write(playerBoard[i], std::size(playerBoard[i]));
    // Or
    std::cout << std::string_view(playerBoard[i], std::size(playerBoard[i]));
}

或者,在末尾添加一個 null 終止符:

char playerBoard[][14] {
    {'2',' ','>',' ','_',' ','|',' ','_',' ','|',' ','_','\n'},
    {'1',' ','>',' ','_',' ','|',' ','_',' ','|',' ','_','\n'},
    {'0',' ','>',' ','_',' ','|',' ','_',' ','|',' ','_','\n'},
    {' ',' ',' ',' ','^',' ',' ',' ','^',' ',' ',' ','^','\n'},
    {' ',' ',' ',' ','0',' ',' ',' ','1',' ',' ',' ','2','\n'},
    {0}
};

// Print the whole array
std::cout << *playerBoard;

// (You can still print individual lines the same way like as above)

暫無
暫無

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

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