2013-12-21 2 views
2

다음 코드를 사용하여 배열에서 음수를 제거하려고합니다. 불행히도 결과를 얻지 못했습니다. 단지 첫 번째 요소를 반복해서 인쇄합니다. 누군가 내가 잘못 가고 있는지 알려주실 수 있습니까?C에서 배열의 음수 제거

#include <stdio.h> 
void removenegative(int a[],int *p, int *q); 
int main() 
{ 
    int a[] = {2, 3, -5, -7, 6, 9}; 
    int i; 
    int *p, *q; 
    p = a; 
    q = a+6-1; 
    removenegative(a, p,q); 
    for(i=0;i<6;i++) 
     { 
      printf("%2d", *p); 
     } 
    printf("\n"); 
} 
void removenegative(int a[],int *p, int *q) 
{ 
    int *x; 
    x= &a[0]; 
    while (p<=q) 
     { 
      if (*p>=0) 
       { 
        *x = *p; 
        x++; 
       } 
      p++; 
     } 
    for(; x<=q; x++) 
     { 
      *x = -1; 
     } 
} 

답변

2

변경 :

printf("%2d", *p); 

가로 :

printf("%2d", a[i]); 

당신은 i 반복하지만, 사용하지 않을 것입니다.

4
for(i=0;i<6;i++) 
    { 
     printf("%2d", *p); 
    } 

당신은 p을 변경하지 않는!

printf("%2d", *p);

for 루프 전에이 작업을 수행 :

+0

5 초에 맞았습니다. ;-) –

+0

@ 0xF1 너의 것이 조금 더 좋았어 +1 : – Guido

+0

같은 2! 메리 크리스마스! ;-) –

4

당신은 하나 개의 값을 인쇄하는

p = a;

및 루프 내에서 p++를 추가;

4

는 그냥 [0]

입니다

for(i=0;i<6;i++) 
    { 
     printf("%2d", *p); 
    } 

당신은 항상 인쇄 * P는 ... 이상하고 그렇게 물론

을 통해 첫 번째 요소를 인쇄
1

코드는 올바른 : p 배열과 끝 배열 마커로 q 행위를 검색하는 동안

void removenegative(int a[],int *p, int *q) 
{ 
    int *x; 
    x= &a[0]; // let x point to the first thing in a 

    while (p<=q) // continue while p points to an address before q 
     { 
      if (*p>=0) // if the thing pointed to by p is greater than zero... 
       { 
        *x = *p; // copy from p to x, increment x 
        x++; 
       } 
      p++; // increment p 
     } 
    for(; x<=q; x++) // while x is less than q... 
     { 
      *x = -1; // fill in -1 
     } 
} 

그래서 x는 증가하는 쓰기 포인터이다.

나는 이것을 타이핑하는 동안 말하기 때문에 두말없이 출력 루틴이 잘못되었다.

+3

그의 모든 좋은 코드를 인용하는 것은 그 질문에 대한 답이 아닙니다. – Barmar

+0

그와는 반대로, "다음 코드로 배열에서 음수를 제거하려고합니다. 불행히도 결과를 얻지 못했습니다."라고 그가 질문 할 때 실제로 결과를 얻고 있음을 보여 주며 자신이 생각하는 코드가 잘못 되었기 때문에 그가 생각하는 것과 정확히 똑같은 것이 질문에 대한 대답입니다. – Tommy

+0

버그가 코드 X에 있음을 지적하는 이상한 방법처럼 보입니다. 코드 Y의 주석이 달린 목록을 제공하는 것입니다. – Barmar