2013-07-22 3 views
2

배열이 uint8_t arr[512]이고이 배열에 문자열, IP 주소 및 32 자리 숫자를 저장해야합니다. 그래서 나는 다른 문자열 배열을 아래와 같이 정의 할 것을 고려했다.문자열을 문자 배열에 저장

uint8_t *ch[] = { 
    "abcd", 
    "1.1.1.1", 
    "123456782341223344445" 
}; 

그런 다음 arr[512]memcpy을한다. 이거 괜찮아? 내가 arr에서 IP 주소를 검색하지 못할 수도 있습니다. 다른 아이디어는 제발. 시간 내 줘서 고마워.

+1

** ** ** [char * str []'과 char'str [] []'의 차이점과 두 함수가 메모리에 저장되는 방식을 살펴보십시오.] (http://stackoverflow.com/questions/17564608/) char * 배열의 이름을 의미하는 배열 이름 (17661444 # 17661444)은 메모리에 저장된 * ch []가 어떻게 memcopy에'source '가 필요한지 알고 있습니다. 기억 ** 반면 **. –

+0

관련 없음 : 왜'char *'대신'uint8_t *'인가? –

+1

문자열을 포함하고있는'struct'가 왜 IP 주소를위한 32Bit-Integer와 32 자리수의 두 번째 문자열을 가지고 있지 않습니까? – MyPasswordIsLasercats

답변

4

포인터 배열을 메모리에 저장하는 방법에 대해 생각해 보면 왜 수행 할 수 없는지 이해할 수 있습니다.

귀하의 문자열 배열은 다음과 같습니다

 
+-------+-------+-------+ 
| ch[0] | ch[1] | ch[2] | 
+-------+-------+-------+ 
    |  |  | 
    |  |  v 
    |  |  "abcd" 
    |  v 
    |  "1.1.1.1" 
    v 
    "123456782341223344445" 

을 그래서 당신은 당신은 단지 포인터 아닌 실제 문자열을 복사 ch 배열에서 memcpy을합니다.


당신은 물론 대상 배열에 개별적으로 배열의 각 문자열을 복사 할 수 있지만, 그것은 분리와 관련이없는 문자열로 그 일을 다르지 없습니다.

+0

동의합니다. 하지만 어떻게 문자열과 다른 것들을'arr [512]'에 저장할 수 있습니까? –

+0

@foo_l 목적지 배열에 하나씩 복사하여 다음 문자열의 시작 위치를 추적하십시오 ('strcpy'와'strlen'가 좋음). –

+1

@foo_l 복사하려면 'sprintf (arr, "% s % s % s", ch [0], ch [1], ch [2]);를 단일 단계로 사용하십시오. (예,하지만 Joachim Pileborg의 제안은 ch []에서 복사 할 문자열 * ("ip")의 개수를 모르고 루프 *를 필요로 할 때 더 좋습니다 * –

0

memcpy()ch[0] ~ ch[2]의 경우 \0이 포함 된 문자열을 사용할 수 있습니다. memcpy() 전체 배열 ch 수 없습니다. arr 내에서 두 번째 문자열을 검색하려면 strlen() 또는 memchr()을 사용할 수 있습니다 : 세 번째 문자열을 얻을 수 adpopt하기 쉽습니다로

char *ip = arr + strlen(arr) + 1; 

또는

char *ip = memchr(arr, '\0', sizeof(arr)) + 1; 

개인적으로 나는 첫 번째 옵션을 prefere 것입니다.

0

uint8_t arr[512]uint8_t *ch[]과 같은 종류가 아닙니다. 첫 번째 배열은 512 바이트 배열입니다. 두 번째는 바이트에 대한 포인터의 배열입니다. 심각한 문제가있을 수 있습니다. 그러니 우리를 도와 주시고 당신이 정말로하고 싶은 것을 말해주십시오.

+0

이것은 대답보다 더 많은 코멘트입니다. – StoryTeller

+0

저는 문자열과 다른 것을'arr [512]'에 저장하기를 원합니다. 따라서 a [1] = b'' a [2] = c'' a [3] = 1'' a [4] = 1'이되어야합니다. 'a [5] = 1'' a [6] = 1'' a [7] = 1' 등등 ... –

2

나는 좋은 생각이라고 생각하지 않습니다. 더 나은 구조를 사용하십시오.

struct info 
{ 
    char* name; 
    char* address; 
    char* number; // or other type 
} 

전체 구조체를 배열에 복사하려면 pragma pack을 사용할 수 있습니다. 또는 그들을 결합하기 위해 복사와 같은 것을 사용하십시오.

정적 배열로 복사하려면 이름 길이를 확인해야합니다.

+0

제안 : 주소에 32Bit- 정수를 사용하십시오. – MyPasswordIsLasercats