[英]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.