2014-11-21 2 views
-2

그래서 문자 (문자 및 공백)의 C 문자열을 C 문자열의 2 차원 배열로 변환해야합니다. 2D 배열의 각 "행"은 문자와 문자로 구성되어야합니다. 필자는 본질적으로 문장의 단어를 가져 와서 배열을 만들어야합니다.c-string에서 c-strings의 2D 배열로 단어 복사

예를 들면 : "내 브랜드의 BMW리스가 도난 당했을 때"는 "im", "upset", "that", "on", "nov"와 같은 2 차원 C- 문자열 배열로 바뀌어야합니다. ","th ","my ","brandnew ","bmw ","lis ","were ","stolen " (공지 사항 "일"과 "내"& "내"와 "BRANDNEW"사이에 두 개의 공백 문자가 있다는 것을)

다음 코드는 나에게 내 콘솔에서 몇 가지 흥미로운 출력을 제공합니다 ...

char document[201] = "im upset that on nov th my brandnew bmw lis were stolen"; 

char documentArray[13][201]; 

for (int i, k, j = 0;document[k] != '\0';) 
{ 
    if (isspace(document[k])) 
    { 
     cout << "found a space" << endl; 
     k++; 
     while (isspace(document[k])) 
     { 
      k++; 
     } 
     i++; 
     j = 0; 
    } 
    if (isalpha(document[k])) 
    { 
     documentArray[i][j] = document[k]; 
     k++; 
     j++; 
    } 
} 

for (int i = 0; i < maxWords +1; i++) 
{ 
    cout << documentArray[i] << endl; 
} 

산출물에 이상한 물건이 있습니다. 나는 그것이 무엇을 의미하는지 알지 못한다. 이 문제를 해결하도록 도와 주시겠습니까? 2 차원 배열에 복사하여 C 문자열의 끝에 종료 널 문자를 추가

im\203\377 
upset 
that 
on 
nov 
th 
my\3261 
brandnew 
bmw_\377 
lis 
were 
stolen\301$r\377 
\377 
+2

'k '가 초기화되지 않았습니다.'document [k]! ='\ 0 ''은 정의되지 않은 동작입니다. – AlexD

+0

네 말이 맞아. k가 명시 적으로 초기화되지 않았습니다. 나는 그것이 0 (어쩌면 믿을 수 없지만)으로 설정되어야한다고 믿는다. 특히 출력은 그것이 작동 중임을 나타내는 것 같다. – Sam

+0

documentArray도 초기화해야합니다. –

답변

0

j++;있는 라인은 다음과

if (j < 201) { 
    documentArray[i][j+1] = '\0'; # terminate the c string 
} else { 
    documentArray[i][j] = '\0'; # cannot terminate the c string, overwrite the last char to terminate the string 
} 

를 삽입 그러나 모든 읽기 및 쓰기 작업이 결코 배열의 크기를 초과하지 있는지 확인하시기 바랍니다 후.

배열 제한은 documentArray [0..12] [0..200]입니다. 항상 확인하시기 바랍니다. =>http://en.wikipedia.org/wiki/Buffer_overflow

+0

이 질문은 프로젝트의 특정 부분에 대한 것이므로 documentArray [13] [201]의 이니셜 라이저는 고의적이지만 고맙습니다! –

+0

배열 차원 이상으로 작성하면 코드를 수정하고, 변수를 수정하고, 프로그램 어딘가에 점프 할 수 있습니다. ;) –

0

시도 :

다음은 콘솔 출력입니다.

C 문자열은 '\ 0'문자로 끝나는 문자 배열로 나타냅니다. 이상한 코드는 '\ 0'이 발생하지 않고 문자 배열의 끝에서 인쇄가 실행 된 결과입니다.