Я пытаюсь сделать простую консольную игру 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") является содержимым входного файла map.txt и отображается именно так, как написано в map.txt, но второй тираж совершенно неожиданный.
Мой вопрос заключается в том, что может быть причиной этого.
РЕДАКТИРОВАТЬ: я понял
map[i] = (char*)temp_line.c_str();
выполняет поверхностную, а не глубокую копию, поэтому я решил проблему, вместо этого динамически выделяя
char[map_width + 1]
at
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