간단한 콘솔 팩맨 게임을 만들려고하고 있으며 다음 원본 코드에서 나오는이 희미한 인쇄물이 발생합니다.C++ 코드는 동일한 문자열 배열을 두 번 연속 인쇄하려고 시도 할 때 매우 다른 두 개의 출력을 흐리게 처리합니다.
#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;
}
내가 여기 다시 코드에서 호출 표준 : COUT의 2 실점을 복사하여 콘솔에 출력 무엇의 스크린 샷 첨부합니다
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;
}
다른 인쇄 실행 :
,691을system("pause");
for(int i = 0; i < map_height; i++){
std::cout << map[i] << std::endl;
}
다음은 스크린 샷과 같습니다 : 시스템 앞에있는 텍스트 블록 ("일시 중지")은 입력 map.txt 파일의 내용이며 map.txt에 작성된 방법과 정확히 일치하지만 두 번째 인쇄 실행은 다음과 같습니다. 전혀 예상하지 못했던
내 질문이 원인이 될 수있는 것을 단순히.
편집 : 나는
map[i] = (char*)temp_line.c_str();
깊은 복사 얕은, 그리고 수행 실현, 따라서 내가 대신 동적
map[i]
에서
char[map_width + 1]
을 할당하여 문제를 해결 및 수행하는 것
나는 당신의 문자열 temp
이 범위를 벗어나 그것으로 가고 있기 때문이다 가능성이
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
편집하려면 null 종결 자의 충분한 공간 (예 : temp.length() + 1 space)도 저장해야합니다. 그래도 문제가 해결되지 않으면 최신 코드를 제공하십시오. – SenselessCoder
완료, 감사합니다! – tgudelj
나중에 참조 할 수 있도록 paddy의 제안을 사용하는 것이 질문에 C++로 태그가 붙여져 있으므로 더 좋으며 이러한 방법을 사용하면 이러한 문제를보다 쉽게 처리하는 데 도움이됩니다. – SenselessCoder