2012-01-28 5 views
5

배열을 한 번 수동으로 루프하여 각 문자 배열의 strlen 수를 계산하고 합계하여 대상을 합계 값으로 할당 한 다음 배열을 다시 반복해야합니까?c에서 문자 배열 배열을 반복하는 방법은 무엇입니까?

문자 배열을 포함하는 배열의 크기를 찾아서 반복 할 수있는 방법은 무엇입니까?

+1

일부 코드는 귀하가 무엇을 요구하는지 이해하는 데 도움이됩니다. – user7116

+0

C 문자열 배열을 복사하려는 것 같습니다. 그게 맞습니까? – vitaut

+0

결국 배열의 문자열을 단일 문자열로 연결하려고합니다. 대상 문자열에 할당 할 메모리 공간을 알아야합니다. for 루프에서 종료 조건으로 넣을 내용, 즉 배열의 길이를 알 수있는 방법을 알지 못합니다. –

답변

7

당신은 어떻게 당신이 그들을 반복 할 수 있도록 문자의 배열을 포함하는 배열의 크기를 찾을 수 있습니까?

  1. 기록 당신이 변수에 할당 배열의 문자열의 수 :

두 가지 방법이 있습니다.

  • 배열 끝 부분에 여분의 char*을 할당하고 NUL 문자가 문자열을 종료하는 데 사용되는 것과 비슷한 방식으로 NIN 포인터를 센티널로 저장합니다.
  • 즉, C는 원하는 정보를 제공하지 않으므로 어레이를 할당 할 때 자신의 부기를 수행해야합니다. 두 번째 제안을 수행하면 실제 연결을 수행 할 때 '\0'을위한 공간을 예약하는 것을 잊지 마세요

    size_t sum_of_lengths(char const **a) 
    { 
        size_t i, total; 
        for (i = total = 0; a[i] != NULL; i++) 
         total += strlen(a[i]); 
        return total; 
    } 
    

    와 문자열의 배열에 문자의 총 수를 얻을 수 있습니다.

    +0

    우리가 간다. 그 모든 답변을 주셔서 감사합니다. –

    +1

    0을 기준으로 + 1도 반환해야합니다. –

    +0

    ... 또는 배열을 실제로 가지고 있다면 sizeof (array)/sizeof (entry)를 사용하여 길이를 얻으십시오 (포인터가 아닙니다 - 그들은 동일하지 않습니다). 많은 사람들 (나도 지난 10 년 정도)은 배열과 포인터가 같다고 생각하지만 그렇지 않습니다. 배열은 필요한 경우 포인터가 자동으로 축약됩니다. 예 : int a [10] = {0}; sizeof (a)/sizeof (int)는 10을 제공합니다; int * a = malloc (10 * sizeof (int)); sizeof (a) == sizeof (int *)이 경우 – griffin

    0

    문자열을 연결하려는 것 같습니다. 그렇다면 그렇습니다. 할당하기 전에 원하는 공간의 양을 알아야합니다.

    사실, realloc을 사용할 수 있지만 매번 이전 문자열이 복사 될뿐 아니라 효과가 떨어집니다.

    일부 코드 :

    int i,l=1; 
    for (i=0;i<n;i++) l+=strlen(s[i]); 
    char *r=malloc(l); 
    r[0]=0; 
    for (i=0;i<n;i++) strcat(r,s[i]); 
    

    편집 (char *s[]int n 가정은)는 길이를 알고 몇 가지 의견으로, strcat는 효과가있다. (. 그것은 한 번에 메모리를 할당하기 때문에 나는 아직도 그것을 선호) 좀 더 효율적인 코드는 다음과 같습니다

    int i,l=1; 
    for (i=0;i<n;i++) l+=strlen(s[i]); 
    char *r=malloc(l); 
    char *d=r; 
    for (i=0;i<n;i++) { 
    srtcpy(d,s[i]); 
    d+=strlen(s[i]); 
    } 
    
    +0

    이'strcat'의 사용은 엄청나게 비쌉니다 : 그것은 알고리즘이 O (n²) 시간 동안 선형으로 실행될 수있게합니다. –

    +0

    어떻게 선형을 수행 할 수 있습니까? @asaelr 제 질문 중 일부는이 경우 n이 무엇인지 파악하는 방법입니다. –

    1

    난 당신이 배열의 모든 스트링의 연결 한 문자열을 만들려고 노력하고 있다고 가정합니다.

    이 일의 2 가지 방법이 있습니다 : 당신이 제안으로

    1. 2 개 패스를 확인, 두 번째 패스에서 문자열을, 첫 번째 패스의 길이를 합산 대상 문자열을 할당 한 다음 추가는

    2. 1 회 통과. 버퍼를 크기에 할당하여 시작하십시오. 총 크기를 추적하면서 문자열을 추가하십시오. 문자열에 충분한 공간이 없으면 버퍼를 realloc()으로 다시 할당하십시오. 가장 효율적인 재 할당 방법은 매번 버퍼 크기를 두 배로하는 것입니다.

    0
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
    
    char *nstrdup(char **args); 
    int main (int argc, char **argv) 
    { 
    char * this; 
    
    this = nstrdup(argv+1); 
    printf("[%s]\n", this); 
    
    return 0; 
    } 
    
    char *nstrdup(char **args) 
    { 
    size_t len, pos; 
    char **pp, *result; 
    
    len = 0; 
    for (pp = args; *pp; pp++) { 
         len += strlen (*pp); 
         } 
    result = malloc (1+len); 
    
    pos = 0; 
    for (pp = args; *pp; pp++) { 
         len = strlen (*pp); 
         memcpy(result+pos, *pp, len); 
         pos += len; 
         } 
    result[pos] = 0; 
    return result; 
    } 
    
    +0

    나는 메타를 좋아하지 않는다. (나는 인터페이스를 이해하지 못한다.) 공백을 편집하는 사람들 (일종의 기업 정식 형식)은 낮은 라이프 스타일이라고 생각합니다. 가버려. ** 그냥 내 소스를 터치하지 마세요 ** 당신 whitespae 편집자. 소스를 읽을 수 없으면 java로 돌아가십시오. – wildplasser

    +0

    [meta] 위조 된 공백 문자를 허용/거부하는 옵션을 추가하십시오. – wildplasser

    관련 문제