当我在程序上工作时,我只打印了一个字符串“ 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
当您向数组中添加数字时,该数组会衰减为指向第一个数组的指针,进行指针算术运算。您最终得到一个指向who-knows-what的指针,然后将其变为std::string
,从而给您带来垃圾。这称为未定义行为。您的程序绝对可以做任何事情,包括看起来正常工作。这是非常危险的。
程序运行时,字符串文字都存储在相同的内存区域中,因此"R"
存储在靠近"IN MAIN"
和的地方"null"
。我想这是由于错误的指针算法将您从的开头移动"R"
到的开头"IN MAIN"
,因此才进行打印。但这绝对不能保证。
正确构建字符串的方法有很多种,最好的方法可能是std::to_string
上述Joachim Pileborg提到的方法。然后,你可以使用+
来连接std::string
的对象。另一种选择是使用std::ostringstream
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句