C++ 输出被打印两次

标签 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

最佳答案

"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/

相关文章:

c++ - 字符指针的二维数组需要以两个null结尾吗?

linux - 构建uchar.h文件和ICU版本相关的训练工具时出现Tesseract错误

C++0x auto、decltype 和模板函数

c++ - 区分模板类构造函数中的 1D 和 2D 容器 (SFINAE)

C++ 模板 : dealing with long class names

c++ - 在 constexpr 中将 `void*` 转换为 `unsigned int`

c++ - C++ 单元测试器中的自定义断言

C++20 - 模板参数推导/替换问题

java - Java 引用和 C++ 引用有什么区别

c++ - delete(非数组形式)是否知道new或new[]分配的内存总量