2012-08-10 3 views
1

에 문자 포인터 배열에서 삭제? 나는 이것을 시도했지만 효과가 없다!는 어떻게에서 "STH"가 셀을 삭제할 C

for(i=0;i<100;ti++) 
{ 

if(strcmp(a[i],"sth")!=0) 
    temp[i]=a[i]; 
} 
a=temp //not sure here 
+1

'a = temp'는 컴파일되지 않습니다. – cnicutar

+0

달성하고자하는 것이 확실하지 않습니다. 그렇게 간단한 것이 아니기 때문에 배열에서 하나의 요소를 삭제 하시겠습니까? 아니면 다른 것을 원하십니까? –

+0

배열에서 단일 요소를 삭제합니다. – Sara

답변

2

뭔가

j=0; 
for(i=0;i<100;i++) 
{ 
    a[j]=a[i]; 
    if(strcmp(a[i],"sth")) { 
    j++; 
    }else{ 
    a[j]=0; 
    } 
} 

처럼 내가 문자열이 어디에서 왔는지 몰라요 때문에 나는, 메모리 여기에 무료 일부러. 문자열이 malloc으로 할당 되었다면 해제해야합니다 (다른 곳에서 사용하지 않으면)

+1

[j]를 0으로 설정하면 다음 반복에서 [j]를 덮어 쓰기 때문에 마지막 반복을 제외하고는 효과가 없습니다. 보관 된 요소가 아래로 이동 된 후에 a의 모든 후행 요소를 0으로 설정하려는 경우 더 나은 방법은 첫 번째 루프의 최종 값에서 j를 증가시키는 두 번째 루프에서이 값을 0으로 설정하는 것입니다 또한 첫 번째 루프에는 오타가있다 :'ti ++'는'i ++'이어야한다. –

+0

코드 끝 부분에 if 문을 추가하지 않고 마지막 요소를 처리하기 위해 a [j]를 추가했습니다. 그렇지 않으면 마지막 요소가 "sth"이면 그대로 유지됩니다. – Gir

+0

'if (j <100) a [j] = 0; '을 추가하면 평균적으로 계산 효과가 더 저렴합니다. 그러나 요점은 무엇입니까? 그것은 j가 100에 도달하면 존재하지 않기 때문에 센티널이 될 수 없습니다. [j] 이후에 더 많은 요소가있을 수 있기 때문에 해제 된 요소를 모두 지우지는 않습니다. –

2

이와 같은 배열에서 셀을 삭제할 수 없습니다. 빈 문자열처럼 임의적으로 설정할 수 있습니다.

열심히 방법은 다음과 같습니다

  • 당신이 새로운
  • 에 이전 배열에서 필요한
  • 이 항목을 복사 새로운 작은 배열을 생성, 삭제하려는 항목을 계산 삭제 예전 것.

왜 이렇게 간단한 지 궁금해 할 수 있습니다. 이유는 배열이 메모리에있는 일련의 데이터이기 때문입니다. 서랍이 많은 지국처럼 작동합니다. 서랍에 넣을 내용을 프로그램에 알릴 수는 있지만 전체 지국을 파괴하지 않고 서랍의 일부만 제거 할 수는 없습니다. 그래서 새로운 것을 만들어야합니다.

+1

또는이 경우 문자열이 아닌 NULL을 가리 키도록 "빈"포인터를 설정할 수 있습니다. 이 프로그램은 가리키는 데이터에 액세스하기 전에 NULL에 대해 모든 포인터를 검사해야합니다. – Lundin