2016-11-04 3 views
1

나는 문자가있는 일부 색인과 일부 문자가있는 문자 배열을 가져 와서 문자가있는 배열로 변경하려고합니다. 필요하면 공백을 제거하기 위해 색인 위로 이동합니다.C - Shift Array 이상

이 나의 접근 방식은 지금까지입니다 :

char *args[256]; 
void removeNulls(){ 
    for(int i=0; i<=token; i++){ 
     if(args[i] == '\0'){ 
      shiftleft(i); 
     } 
     } 
} 

void shiftleft(int start){ 
    for(int i=start; i<token; i++){ 
      *(args+i) = *(args + i +1); 
       } 
} 

그러나, 나는이 작업을 수행하고 그 결과를 출력 할 때 내가 args 배열, 초기 args 배열은 에서, 그것은으로 구성되어 있음을 알 수 : 널 (null) , 널, 1,2,3,4 널을 제거한 후에이 배열은 널 1,2,3,4가 아닌 원하는 1,2,3,4가됩니다. 이 문제를 설명하기 위해 루프 조건에서 빠진 것이 있습니까?

+1

당신이 당신의 완전한 프로그램을 보여줄 수있을 것입니다 볼 수? 그건 컴파일되지 않습니다. – Schwern

+0

BTW,'* (args + i)'에 대한 편리한 속기가있다 : 그것은 args [i]'로 쓰여질 수있다. –

답변

4

건너 뛸 때에도 항상 i을 증가시키기 때문에 하나의 색인은 널 때리면 건너 뜁니다. 당신은 다음과 같은 예를 들어, 건너 뛰는없는 경우에만 i를 증가한다 : 그런데

for (int i=0; i<=token;) { 
    if (args[i] == '\0') { 
     shiftleft(i); 
    } else { 
     i++; 
    } 
} 

을, 알고리즘은 모든 널을 위해, 당신은 전체 나머지 부분을 이동하기 때문에, 여러 널 (null)이있을 때 최적이 아니다. 채우기 위해 현재 인덱스와 다음 인덱스를 추적하여 단일 패스에서 Null을 통해 내용을 이동할 수 있습니다. 각 null 값의 경우 다음 채우기 인덱스는 현재 인덱스보다 한 단계 앞당겨집니다.

for (int i=0, next = 0; i<=token; i++) { 
    if (args[i] != '\0') { 
     args[next++] = args[i]; 
    } 
} 

마지막으로 과잉 요소는 무엇입니까? 즉, 입력 null, null, 1, 2, 3, 토큰의 경우 결과 컨텐츠는 1, 2, 3, 2, 3, 토큰이됩니다. 괜찮습니까? 아마도 나머지 요소와 관련하여 몇 가지 작업을 수행해야하므로 요구 사항을 확인하는 것이 좋습니다. 나는 당신의 운동을 위해 그것을 떠난다.

0

I = shiftleft (0)라고 0, 주소 (인수 + I)로 가리키는간에 값

경우 -> (인수 + 0) -> "NULL"은 (인수로 대체 + i + 1) -> (args + 0 + 1) -> "null".

출력이 null, 1,2,3,4를 인쇄하는 이유입니다.

는 null로 입력을 변경

, 1,2,3,4 당신은 difference.The 출력은 다음 1,2,3,4