C ++输出被打印两次

阿卜耶·贾廷·多西

当我在程序上工作时,我只打印了一个字符串“ 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当您向数组中添加数字时,该数组会衰减为指向第一个数组的指针,进行指针算术运算。您最终得到一个指向who-knows-what的指针,然后将其变为std::string,从而给您带来垃圾。这称为未定义行为您的程序绝对可以做任何事情,包括看起来正常工作。这是非常危险的。

程序运行时,字符串文字都存储在相同的内存区域中,因此"R"存储在靠近"IN MAIN"和的地方"null"我想这是由于错误的指针算法将您从的开头移动"R"到的开头"IN MAIN",因此才进行打印。但这绝对不能保证。

正确构建字符串的方法有很多种,最好的方法可能是std::to_string上述Joachim Pileborg提到的方法。然后,你可以使用+来连接std::string的对象。另一种选择是使用std::ostringstream

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C:字符串错误打印两次

来自分类Dev

C ++ ifstream; 每个'\ n'字符打印两次

来自分类Dev

值在输出中显示两次(C编程)

来自分类Dev

值在输出中显示两次(C编程)

来自分类Dev

为什么“ Hello world”被打印两次?

来自分类Dev

在C中使用printf时,为什么字符串两次打印两次?

来自分类Dev

C ++-两次DrawText()

来自分类Dev

为什么我的for loop提示第一次被打印两次?

来自分类Dev

为什么不能为此C ++代码示例打印两次解构?

来自分类Dev

停止printf打印两次在C中运行检查框架?

来自分类Dev

C程序将最后一行打印两次(文件I / O)

来自分类Dev

C# 字符串列表:防止两次打印相同的索引

来自分类Dev

为什么此C#代码产生两次输出

来自分类Dev

C:如何避免两次解析输出时重复popen?

来自分类Dev

同一件事被打印两次-JS数组

来自分类Dev

两次阅读C ++ ifstream吗?

来自分类Dev

C ++两次删除指针

来自分类Dev

对结构列表两次排序C ++

来自分类Dev

C ++两次声明变量

来自分类Dev

C ++必须输入两次

来自分类Dev

分叉的孩子“打印”两次重定向标准输出

来自分类Dev

为什么在分叉时pid0被打印两次并带有一个值?

来自分类Dev

printf在C中打印2次输出

来自分类Dev

我的python输出打印两次,而我希望它打印一次

来自分类Dev

Nodejs打印两次

来自分类Dev

打印日期两次

来自分类Dev

用C语言对链表进行两次排序

来自分类Dev

目标C-两次释放会导致崩溃?

来自分类Dev

C ++:通过地图进行两次迭代