gpt4 book ai didi

C++代码在尝试连续两次打印相同的字符串数组时脱口而出两个截然不同的输出

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:21:21 25 4
gpt4 key购买 nike

我正在尝试制作一个简单的控制台 pacman 游戏,但我遇到了来自以下源代码的模糊打印输出:

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
int main(){
std::ifstream map_file;
int map_width, map_height;
try{
map_file.open("map.txt");
}
catch(int e){
std::cout << "An exception occured." << std::endl;
}
map_file >> map_width;
map_file >> map_height;
char* map[map_height];
for(int i = 0; i < map_height; i++){
std::string temp_line;
getline(map_file, temp_line);
map[i] = (char*)temp_line.c_str();
std::cout << map[i] << std::endl;

}
system("pause");
for(int i = 0; i < map_height; i++){
std::cout << map[i] << std::endl;

}
return 0;
}

我将再次从该代码复制调用 std::cout 的两次运行,并附上控制台输出内容的屏幕截图:

    for(int i = 0; i < map_height; i++){
std::string temp_line;
getline(map_file, temp_line);
map[i] = (char*)temp_line.c_str();
std::cout << map[i] << std::endl;

}

其他印数:

    system("pause");
for(int i = 0; i < map_height; i++){
std::cout << map[i] << std::endl;

}

截图如下:system("pause") 之前的文本 block 是输入的 map.txt 文件的内容,并准确显示了它在 map.txt 中的写入方式,但第二次打印运行完全出乎意料.

obscure printout screenshot

我的问题只是可能导致这种情况的原因。

编辑:我意识到

map[i] = (char*)temp_line.c_str();

执行浅拷贝而不是深拷贝,因此我通过动态分配一个

来解决这个问题
char[map_width + 1]

map[i]

和表演

strcpy(map[i], temp_line.c_str());

我还是很感兴趣,原来的程序怎么可能写出来

ystem32\cmd.exe
ystem32\cmd.exe
ystem32\cmd.exe
ystem32\cmd.exe
ystem32\cmd.exe
ystem32\cmd.exe
ystem32\cmd.exe
ystem32\cmd.exe
ystem32\cmd.exe
ystem32\cmd.exe
ystem32\cmd.exe
ystem32\cmd.exe
ystem32\cmd.exe
ystem32\cmd.exe
ystem32\cmd.exe
ystem32\cmd.exe
ystem32\cmd.exe
ystem32\cmd.exe
ystem32\cmd.exe

最佳答案

未定义的行为。您正在存储不再有效的指针:

map[i] = (char*)temp_line.c_str();

如果您的 map 存储了 std::string 值而不是指针,那么这样做会很好:

map[i] = temp_line;

我还注意到您使用的是可变长度数组。不。请改用 std::vector。对于初学者来说,最简单的方法是这样做:

std::vector<std::string> map( map_height );
for( int i = 0; i < map_height; i++ )
{
getline( map_file, map[i] );
}

关于C++代码在尝试连续两次打印相同的字符串数组时脱口而出两个截然不同的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40621754/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com