当我在编写一个程序时,我打印了一次字符串“IN MAIN”,但它打印了两次。有人可以向我解释这种行为吗?
#include <iostream>
#include<vector>
std::string checkWin(std::vector<std::vector<int>> board){
bool win = false;
for(int i = 0 ; i < board.size(); i++){
int count = 0;
for(int j = 1 ; j < board[0].size(); j++){
if(board[i][j-1] == board[i][j]) count++;
}
if(count == board[0].size()-2) return "R"+i;
}
return "null";
}
int main() {
std::vector<std::vector<int>> board=
{
{'x','o','x'},
{'o','o','o'},
{'x','x','o'}
};
std::cout<<"IN MAIN";
std::cout<<checkWin(board);
return 0;
}
最佳答案
"R"+i
不会将数字附加到字符串。 "R"
是一个 char
数组,包含值 {'R', '\0'}
。当你向它添加一个数字时,这个数组会衰减为指向第一个 char
的指针,进行指针运算。你最终得到一个指向谁知道什么的指针,然后它变成一个 std::string
,给你垃圾。这叫做 Undefined Behaviour .您的程序绝对可以做任何事情,包括看起来正常工作。这是非常危险的。
字符串文字在程序运行时都存储在内存的同一区域,所以"R"
存储在靠近"IN MAIN"
和的地方“空”
。我想发生的事情是错误的指针算法将您从 "R"
的开头移动到 "IN MAIN"
的开头,这就是打印的原因。但这绝对不能保证。
有多种方法可以正确构建字符串,最好的可能是 std::to_string
上面 Joachim Pileborg 提到的。然后您可以使用+
连接std::string
对象。另一种选择是使用 std::ostringstream
.
关于C++ 输出被打印两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34218563/