2010-08-18 1 views
0

안녕하세요 모두 두 번째 배열의 값을 반복하지 않고 첫 번째 배열에서 두 번째 배열로 일부 데이터를 복사 할 두 배열이 있습니다. 누군가 내가 여기에 오지 않을 것이라고 말할 수 있습니까?포함 된 데이터를 반복하지 않고 한 배열의 내용 일부를 다른 배열에 복사

#include <stdio.h>   
#include <stdlib.h>   
#include <string.h> 

main() 
{ 
    char *hours; 
    char *strl; 
    hours = {0,0,0,0,1,1,2,2,2,5,5,10,10,10,10,10,.,.,.,23}; 

    strl=calloc(100,sizeof(char)); 

    sprintf(strl, "%d", hours); 

    if(strcmp(strl, hours)) 
    { 
     if(*strl) 
      strcpy(strl,hours); 
    } 
    printf("%s ",strl; 
} 
+0

원본 배열이 항상 정렬되어 있습니까? – sje397

+1

내가 싫어하는 것은 무엇입니까? 코드 예제를 올바르게 들여 쓰고 생각하는 내용을 설명하십시오. – Sjoerd

+1

그러면 첫 번째 질문이 아니므로 오류없이 경고없이 컴파일하는 코드를 제공해야한다는 것을 알았을 것입니다. 그리고 누군가는 기꺼이 토론 할 것입니다. –

답변

0

우선 두 가지 문자 배열이 있습니다. 자, C에서는 문자 배열이 문자열을 저장하는 데 종종 사용되지만, 그렇게하지는 않습니다. 이것은 문자열이 아니므로 라이브러리의 문자열 함수를 모두 잊어 버리십시오.

실제로는 두 개의 작은 정수 배열이 있으므로 int 배열처럼 처리 할 수 ​​있습니다.

#include <stdio.h>   
#include <stdlib.h>   

int main() 
{ 
    char *hours; 
    char *strl; 
    int i; 
    int j; 
    char last; 
    /* I'm going to assume the the values in hours are sorted. */ 
    hours={0,0,0,0,1,1,2,2,2,5,5,10,10,10,10,10,.,.,.,23} 

    strl=calloc(100,sizeof(char)); 

    j = 0; 
    last = hours[0]; 
    for(i=1; i < 100; ++i) // I'm going to assume hours has 100 items 
    { 
     if (hours[i] != last) 
     { 
      strl[j++] = last; 
      last = hours[i]; 
     } 
    } 
    strl[j++] = last; // UPDATE (Thanks, Matthew) 
} 

/* printf("%s ",strl; 
    You'll need a different way of printing you results */ 
} 
+0

-1, init 구문이 정확하다면 그는'char' 배열을 가지고있을 것입니다. 충분히 작은'int'는 문제없이'char'로 직접 변환됩니다. –

+0

@Jens, James가 맞습니다. NUL 종료 배열을 사용하지 않고 문자열 함수를 사용할 수 없습니다. 그의 배열은 NUL이 아니라 23으로 끝납니다. –

+0

오프 바이 한 오류가 있습니다. '시간'의 최종 고유 값 (여기서는 23)은 복사되지 않습니다. –

0

당신은 아마 더 그런 짓을 할 :

char *dst = strl; 
char *cur = hours; 
char prev = '\0'; 
while(*cur) { 
    if(*cur != last) { 
    prev = *dst = *cur; 
    dst++; 
    } 
    cur++; 
} 

참으로 아, 그리고 다른 사람에 의해 언급 된 바와 같이, 당신의 배열이 너무 표준 문자열 함수가 작동하지 않습니다, '\0' 종료되지 않습니다 (그리고 그 문제에 대해서는 둘 다 내 루프가 될 것이다).

둘째, 표준 C 라이브러리 함수 중 아무 것도 원하는대로 수행 할 수 없습니다. 내 루프를 수정하기 위해 여러분에게 맡길 것입니다. 배열이 정렬되어있는 경우에만 작동합니다 (배열이 정렬 된 경우에만 작동합니다).

+0

당신은 NUL로 끝나는 문자열을 가정하고 있습니다. 실제로 0이 시작에 있습니다 ... –

0

James가 말했듯이 배열은 NUL 종료가 아니므로 문자열 함수를 사용할 수 없습니다. 비록 할 수 있더라도 strcmp는 항상 0이 아닌 (특히 음의) 값을 반환하며 *strl은 항상 0이됩니다. 이는 항상 실패 할 경우 내부를 의미합니다. 마지막으로 strcpy은 중복을 제거하지 않습니다. 배열이 정렬 된 경우 연속 된 값이 중복되는지 검사하여 배열을 정렬 할 수 있습니다. 그렇지 않으면 GHashTable과 같은 해시 세트/해시 테이블을 사용할 수 있습니다.

+0

모두들 고마워요. 도움이되었습니다. 저는이 일에 정말로 많은 시간을 보냈습니다. – chriscol

관련 문제