2011-09-09 3 views
1

개행 문자는 C++에서 특별한 의미가 있습니까? 비 ASCII 문자입니까?왜이 문자가 내 프로그램을 멈추게합니까?

큰 텍스트 내에서 고유 한 n 문자의 부분 문자열 각각에 대해 Markov 체인을 만들려고합니다. 새로운 고유 한 하위 문자열을 발견 할 때마다 값이 256 요소 벡터 (확장 ASCII 테이블의 각 문자에 대해 하나의 요소) 인 맵에 입력합니다.

for(int i=0; i<lines.size(); i++) cout << lines[i] << endl; 

전체 텍스트 파일에 표시 : 나는 파일의 전체 내용을 ("선"ifstream과의 getline을 사용하여 구축 된 텍스트 행의 벡터이다) 인쇄 할 때

아무 문제 없습니다 콘솔. char 문자를 기대하는 함수에 개행 문자를 반환하려고하면 문제가 발생합니다. "moveSpaces"는 각 반복에서 문자열 벡터에서 앞으로 얼마나 많은 문자가 더 이동할 것인지를 결정하는 정수 상수입니다.

char GetNextChar(int row, int col){ 
    for (int i=0; i<MOVESPACES; i++) { 
     if (col+1<lines[row].size()) { 
      col+=1; 
     } else {  // If you're not at the end of the line keep going 
      row+=1;  // Otherwise, move to the beginning of the next row 
      col=0; 
     } 
    } 
    return lines[row].at(col); 
}  

내가 디버거를 통해 걸어, 그리고 한 그것은 나를 밖으로 배변 번째 행의 1 열에 도달 할 때 - 아니 오류 또는 아무것도. 호출 함수가 아니라이 함수 내에서 실패합니다.

내가 사용중인 파일은 크리스마스 캐롤 (Project Gutenberg에서 처음 나온 파일)입니다. 참고로 여기 처음 몇 줄은 다음과 같습니다

STAVE I: MARLEY'S GHOST 

MARLEY was dead: to begin with. There is no doubt 
whatever about that. The register of his burial was 

는 두 번째 줄에 첫 번째 문자를 반환해야 함수 나누기. 줄 바꿈을 없애거나 프로그램에서 "lines"벡터를 한 줄씩 빌드하면 이런 일은 일어나지 않습니다. 어떤 생각이 잘못된거야?

+0

무엇이'moveSpaces'입니까? –

+3

내 디버거가 내게 결코 쓰레기를 던지지는 않는다. 당신의 생각은 분명하지 않다. 분명히 –

+2

솔직히, 나는이 질문의 머리 나 꼬리를 만들 수 없다. "실패"는 무엇을 의미합니까? – MSalters

답변

8

사용자의 GetNextChar 함수는 사용자가 일부 행의 마지막 문자에있는 경우 다음 행에 문자가 있다고 가정합니다. 그 다음 줄에 등장 인물이 없다면 어떻게 될까요? 이것은 두 곳에서 발생할 수 있습니다 : 파일 끝을 치거나 다음 줄이 빈 문자열 일 때.

두 번째 줄은 빈 문자열입니다.

+0

물론! 대단히 감사합니다. – jefflovejapan

+0

좋은 지적 : 개행 문자에 관한 모든 이야기는 실제로 그가 개행 문자를 가졌다 고 생각하게했습니다. 그러나 시작 부분에서 'endl'은 그 줄 바꿈을 언급하고 있음에도 불구하고 실제로 저장하지 않고 출력에 다시 삽입한다는 것을 보여줍니다. – MSalters

관련 문제