문자열에 getline을 사용하여 infile에서 행을 읽고 문자열의 첫 번째 m 개의 공백이 아닌 문자를 포함하는 c- 문자열로 문자열을 변환 한 다음 c- 문자열을 단일 char 배열로 연결하는 프로그램을 작성하고 있습니다.문자열 길이에 따른 분할 오류?
샘플 파일은 다음과 같이 보일 수 있습니다
5 //number of rows and columns in a grid
2 //number of grids
XXXXX
XXXXX
XXXXX
XXXXX
XXXXX
XXXXX
XXXXX
XXXXX
XXXXX
XXXXX
그래서 내가 2x5x5 문자의 char 배열로 끝날 것입니다.
문제는 위에서 설명한 것과 같은 작은 테스트 케이스에서 코드가 올바르게 작동하지만 더 큰 눈금 (예 : 100x100x100)에서 시도 할 때 세분화 오류입니다.
#include <iostream>
#include <string>
using namespace std;
int main(){
int mapsize,levels;
cin>>mapsize;
cin>>levels;
char map[mapsize*mapsize*levels];
string input;
for (int i=0;i<levels;i++){
for (int j=0;j<mapsize;j++){
getline(cin,input);
char *row;
row=new char[input.size()+1];
strcpy(row, input.c_str());
for (int k=0;k<mapsize;k++){
map[i*mapsize*mapsize+j*mapsize+k]=row[k];
}
delete [] row;
}
}
return 0;
}
가 나는 INFILE이 프로그램을 호출 할 것 : 나는 GDB를 사용하여 실행하고 역 추적을 한 적이 <
infile.in ./program. 항상 "문자열 입력;"을 가리 킵니다.어떻게하면이 segfault를 해결할 수 있습니까? 감사합니다
런타임 배열 크기 조정은 표준 C++과 호환되지 않습니다. gcc가 허용하는 이유는 C99와 호환되기 때문입니다. – doron
루프에서 사용되는 변수를 포함하여 변수에 더 나은 이름을 사용해야합니다. 'i'는 하나의 루프가있을 때 훌륭한 이름이지만, 3 개의 중첩 된 루프가있을 때 레벨, 행, 열 ...이라는 적절한 이름을 부여하면 더 좋을 것입니다. 또한 왜 그런지 이해가되지 않습니다. 문자열의 내용을 덤프하고지도에 복사하는 동적 문자 배열을 만드는 ... 문자열에서 직접 복사하지 않는 이유는 무엇입니까? –