C ++输出被打印两次

时间:2015-12-11 07:51:40

标签: c++ c++11

当我正在编写程序时,我打印了一个字符串“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;
}

http://ideone.com/VbgZ1y

1 个答案:

答案 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