当我正在编写程序时,我打印了一个字符串“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;
}
答案 0 :(得分:4)
"R"+i
不会在字符串中附加数字。 "R"
是char
的数组,包含值{'R', '\0'}
。当你向它添加一个数字时,这个数组衰减到指向第一个char
的指针,进行指针运算。你最终会得到一个指向who-know-what的指针,然后它变成了std::string
,给你垃圾。这称为Undefined Behaviour。你的程序可以做任何事情,包括看似正常工作。这很危险。
当程序运行时,字符串文字都存储在相同的内存区域中,因此"R"
存储在接近"IN MAIN"
和"null"
的位置。我想发生的事情是,糟糕的指针算术会让你从"R"
的开头移动到"IN MAIN"
的开头,这就是打印的原因。但这绝对不能保证。
有多种方法可以正确地建立一个字符串,最好的可能是Joachim Pileborg上面提到的std::to_string
。然后你可以使用+
来连接std::string
个对象。另一种选择是使用std::ostringstream
。