2017-03-03 6 views
0

txt 파일에서 읽은 큰 배열에서 공백을 제거하려고합니다. 내가 처리 할 배열의 strlen()은 약 15,000 ~ 22,500입니다. 나는 공백()를 두 번 같은 모든 공백을 제거하기를 사용해야C - 공백 제거

이 짧은 배열 작동
#include <stdio.h> 
#include <ctype.h> 

void whiteSpace(char str[]){ 
    int i, j; 
    for (i = 0; str[i] != 0; i ++){ 
     if (isspace(str[i])){ 
      for(j = i; str[j] != 0; j ++){ 
       str[j] = str[j + 1]; 
      } 
     } 
    } 
} 

하지만, 더 큰 배열 : 여기

내 코드?

알고리즘이 옳다고 생각합니다. 왜 함수를 두 번 또는 세 번 호출하지 않으면 짧은 배열과 큰 배열 (15,000 ~ 22,500) 배열에 문제가 있는지 알 수 없습니다.

감사합니다.

+0

더 큰 저장 공간을 위해 동적 메모리 할당을 고려하십시오. – minigeek

+1

[C에서 문자열에서 공백 제거?] (http://stackoverflow.com/questions/1726302/removing-spaces-from-a-string-in- c) – BLUEPIXY

답변

2

작은 배열에서는 제대로 작동하지 않습니다. 연속으로 두 개의 공백이 있으면 오류가 발생합니다.

문제는 하나의 공백을 건너 뛸 때 이동 된 문자가 공백인지 여부를 확인하지 않는다는 것입니다.

해결 방법에는 여러 가지가 있습니다. 가장 쉽지만 가장 좋은 방법은 ifwhile으로 변경하는 것입니다.

+1

덕분에, 당신은 정확합니다 ... – Paul

1

이것은 작업을 수행 할 수있는 가장 효율적인 방법에 관한 것이지만 표시되는 특정 문제는 행의 여러 공백으로 인해 발생합니다. 상상해보십시오. 여러분이 i 루프를 따라 스캔하고 있다고 가정하면 두 개의 공백 중 첫 번째 공백을 볼 수 있습니다. 그래서 당신은 j 루프를 시작합니다. 배열에서 그 이후의 모든 것을 처음으로 한 문자 더 가깝게 옮깁니다. 이동하는 첫 번째 문자는 두 번째 공백이며 첫 번째 공백이있는 곳에 놓습니다. 결국 이동을 마친 후 i은 다음 문자로 이동합니다. 첫 번째 공백이 있던 곳으로 이동 한 두 번째 공백을 지나서입니다. 이제 버퍼에 공간이 남아 있지만 i이 지나서 가리키고 있으므로 뒤에 남습니다.

+0

배열에서 모든 공백을 제거하는 가장 효율적인 방법은 무엇입니까 ??? – Paul

+2

한 가지 방법은 두 개의 인덱스 ('get'와'put')를 배열을 통해 앞으로 이동시키는 것입니다. 그것들이 같지 않으면'str [get]'을'str [put]'에 복사합니다. 'str [get]'이 공백 인 경우,'get'을 증가시킵니다 (그러나 복사하지는 않습니다). 그렇게하면 공간이 아닌 모든 것이 배열의 앞쪽으로 위로 스쿼시 될 것입니다. –

+0

정말 고마워요! – Paul