간단한 소스인데 이해가 잘안가서요
글쓴이: ch0nn0m / 작성시간: 일, 2010/10/24 - 2:45오후
이해가 잘 안가는 부분은...
memcpy(buf,fp+2,(sp - fp)-2);
여기에서 fp에서 sp를 빼는게 아닌가요??
#include <stdio.h> int main() { char *hello = "aaa::data::bbb\0"; char *org = hello; char *fp; char *sp; char buf[10] = {'\0',}; fp = strstr(hello, "::"); printf("%s\n",fp); // fp는 ::data::bbb를 가리킨다. sp = strstr(fp+2, "::"); // fp+2 는 data::bbb 이다. printf("%s\n",sp); // 그러므로 sp는 ::bbb가 된다. memcpy(buf,fp+2,(sp - fp)-2); // fp+2는 data::bbb 이다. // sp - fp 는 6이다. 여기에는 "::"도 포함되어 있으므로 -2를 해준다. // 결국 data::bbb 에서 4만큼으 크기의 데이터를 buf에 복사한다. printf("%s\n",buf); // 그러므로 data가 출력된다. }
Forums:
"aaa::data::bbb\0"의 제일
"aaa::data::bbb\0"의 제일 첫글자의 주소를 0이라고 생각하고 fp와 sp의 값을 계산해보면 답이 나올 것같습니다.
참고로 큰따옴표로 적는 문자열상수의 경우 \0을 굳이 안적어도 맨뒤에 자동으로 \0이 들어갑니다.
당연히 아닙니다. ^^;
이해가 잘 안가는 부분은...
memcpy(buf,fp+2,(sp - fp)-2);
여기에서 fp에서 sp를 빼는게 아닌가요??
라고 하셨는데 당연히 sp-fp가 맞습니다.
각각 데이터들을 보면
sp = ::bbb
fp = ::data::bbb
라고 되어 있지만 sp와 fp는 포인터 변수로 각각의 주소값을 갖고 있는겁니다.
예를 들어 hello가 "aaa::data::bbb\0"이지만 이건 text영역에 들어 있는 "aaa::data::bbb\0"의 첫번째 주소값을 hello가 갖고 있다는 의미이고
만약 그 값이 0이었다면 fp는 3, sp는 9의 주소를 가지고 있는 것입니다.
a a a : : d a t a : : b b b
0 1 2 3 4 5 6 7 8 9 10 11 12 13
질문하신 분은 텍스트의 길이로 계산하는것을 생각하신것 같은데 그렇다면
strlen(fp) - strlen(sp) 로 계산해야 합니다.
C에서 string을 어떻게 다루는지 이해가 필요할 것 같습니다 ^^
댓글 달기