J'essaie de faire un simple jeu de console pacman et j'éprouve cette sortie d'impression obscure provenant du code source suivant:Le code C++ libère deux sorties très différentes en essayant d'imprimer le même tableau de chaînes deux fois de suite
#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;
}
je copier les deux séries d'appeler std :: cout de ce code ici encore et joindre une capture d'écran de ce qui était sortie dans la console:
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;
}
Autre tirage d'impression:
system("pause");
for(int i = 0; i < map_height; i++){
std::cout << map[i] << std::endl;
}
Voici la capture d'écran: bloc de texte avant le système ("pause") est le contenu du fichier map.txt en entrée et est affiché exactement comment il est écrit dans map.txt, mais la deuxième impression est totalement inattendu.
Ma question est tout simplement ce qui pourrait être la cause.
EDIT: J'ai réalisé
map[i] = (char*)temp_line.c_str();
effectue une faible profondeur, et non une copie profonde, donc je fixe la question en lieu allouer dynamiquement une
char[map_width + 1]
à
map[i]
et exécutant
strcpy(map[i], temp_line.c_str());
Je suis toujours intéressé par la façon dont pourrait avoir le programme original peut-être écrit
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
Pour votre modification, assurez-vous d'économiser suffisamment d'espace pour le terminateur null (par exemple, temp.length() + 1 espace). Si cela ne fonctionne pas, fournissez votre code le plus à jour. – SenselessCoder
Fait, merci! – tgudelj
Pour référence future, l'utilisation de la suggestion de paddy est préférable car la question est étiquetée avec C++, et l'utilisation de ces méthodes vous aiderait à gérer ces problèmes plus facilement. – SenselessCoder