간단한 소스인데 이해가 잘안가서요

ch0nn0m의 이미지

이해가 잘 안가는 부분은...
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가 출력된다. 
} 
klyx의 이미지

"aaa::data::bbb\0"의 제일 첫글자의 주소를 0이라고 생각하고 fp와 sp의 값을 계산해보면 답이 나올 것같습니다.
참고로 큰따옴표로 적는 문자열상수의 경우 \0을 굳이 안적어도 맨뒤에 자동으로 \0이 들어갑니다.

kkn1380의 이미지

이해가 잘 안가는 부분은...
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을 어떻게 다루는지 이해가 필요할 것 같습니다 ^^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.