簡體   English   中英

MinGW-w64 上 cin 和 scanf() 的問題

[英]Problems of cin and scanf() on MinGW-w64

我的 MinGW-w64 的版本是:x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z

我的系統版本是:Windows 10 2004

當我嘗試使用 MinGW-w64 的 g++ 編譯和運行這個源文件時,我遇到了麻煩。 這個文件的名字是“temp.cpp”

#include <iostream>
using namespace std;
int main()
{
    char player1[8] = {0}, player2[8] = {0};
    cin >> player1 >> player2;
    cout << player1 << ' ' << player2;
    return 0;
}

通過輸入這行代碼,我在 PowerShell 中構建並運行了這個文件。

g++ -g .\temp.cpp -o .\temp.exe; .\temp.exe

然后我輸入了輸入。

Rock Scissors

在我按下回車鍵之后。 我懂了。

 Scissors

第一個字沒有打印出來。

然后我使用 VS Code 調試源文件。 我輸入輸入后發現, player1[0]中的數據沒有被“R”替換。 相反,它仍然是0

然后我將整個mingw64文件夾復制到另一台計算機上再試一次,同樣的事情又發生了。

然后我用scanf()替換了cin。

#include <iostream>
using namespace std;
int main()
{
    char player1[8] = {0}, player2[8] = {0};
    scanf("%s %s", player1, player2);
    printf("%s %s", player1, player2);
    return 0;
}

同樣的事情又發生了。

然后我下載了MinGW-w64的舊版本:x86_64-5.4.0-release-posix-seh-rt_v5-rev0.7z

通過使用舊版本,現在可以正常打印了。

為什么?

哦...您的數組對於Scissors來說是一個字符太短。 對於nul 終止字符,您需要 9 個字符8 + 1 所以在你的堆棧上發生的事情是你有Player1后跟Player2 (但由於堆棧增長, Player1在 Player2 上方的Player2) ,例如

    |        Player2                |        Player1                |
    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    | S | c | i | s | s | o | r | s | \0| o | c | k | \0|   |   |   |
    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

因此,當您輸入"Scissors"並且為字符串結尾寫入 nul 終止字符時,您會用'\0'覆蓋Player1的第一個字符,使其看起來是一個空字符串。

經驗教訓——不要吝嗇緩沖區大小! (或者更好的是,使用std::string

宣布:

char player1[32] = {0}, player2[32] = {0};

或者

#include <string>
...
std::string player1 {}, player2 {};

然后再試一次。

暫無
暫無

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

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