프로그래밍

 3198, 1/160 회원가입  로그인  
   schcp91
   [C언어] C 언어에 대해서 질문 좀 하겠슴니당. 봐주라능!!

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=2795 [복사]


/* strcopy.c */
#include <stdio.h>

void strcopy (char *pDst, char *pSrc);

void main()
{
         char szString1[20] = "This is a String";
         char szString2[20] = { 0, };

         strcopy (szString2, szString1);

         printf("szString2 : %s \n", szString2);
}

void strcopy (char *pDst, char *pSrc)
{
         while( (*pDst++ = *pSrc++ ) != '\0' );
}

말 그대로 문자열을 복사하는 간단한 코드인데요.

이 부분이 좀 이해가 갈랑 말랑 하는 데.
         while( (*pDst++ = *pSrc++ ) != '\0' );
지금 이 문장은 szString1의 배열에 저장된 값들이 하나 하나 szString2로 대입 혹은 옮겨지고 있는 것인데..

(*pDst++ = *pSrc++ ) != '\0'
이 부분을 어떻게 해석하면 좋을 지.. 말로 풀이해주심 감사함니당-0

(*pDst++ = *pSrc++ ) 이게 NULL 문자가 될 때까지 while 문을 실행하는 것인데,
구체적으로 *pDst가 NULL 문자가 나올 때 까지 실행하는 건가요? 참 해석하기 난감하네요.
(*pDst++ = *pSrc++ ) 이것 자체가 어떻게 NULL이 되라는 건지..

제 개인적인 생각으로는,
szString1의 "This is a String"에서 마지막 문자 g까지 szString2에 대입된 후, 공백 문자('\0')가 아마 szString2에 대입되겠죠? 왜냐면 배열의 마지막은 항상 NULL 문자가 포함되니까요. 따라서, szString1의 마지막 NULL 문자가 szString2로 옮겨지는 거구요. 그쵸????? 쓰다보니 이게 맞는 것 같은데..
하여튼 그 때, while문이 종료 되는 것이라고 저는 생각하는데.

해커스쿨 분들은 잘하시니까. ('님들은'이라고 쓰면 비정상적인 통신어체라서 사용하지 말라고 되어있네염-)
제 막연한 생각. 뻥 뚫리게 도와주삼.
대학 가기전에 혼자 공부하는 거라, 도움 줄 사람들이 여기 밖에 없네영 ㅋㅋ


  Hit : 4786     Date : 2010/12/08 01:42



    
hideroot 그 개인적인 생각이 정확히 맞습니다. 2010/12/08  
schcp91 정말 감사드립니다....우후~ -0 2010/12/08  
두루뭉술 널일때까지 pSrc의 문자열을 pDst 로 넣어주고 한번씩 증가시키네요 복사하는 코드들중에 제일 간결해보여요 ㅋㅋ 2010/12/08  
schcp91 쩔죠 뭐 ㅋㅋㅋㅋㅋ
프로그래밍란게 참 신기하네염 ㅋㅋ
2010/12/08  
CodeAche 결국엔
(*pDst++ = *pSrc++ )
이구문에서 pDst 와 '\0' (0) 만 가지고 검사합니다.
어차피 pDst에는 pSrc의 데이터가 이동되니 당연한거겠지만요.
아래 디버깅 결과를 보면 더 확실히 알 수 있습니다.

0x0804844b <strcopy+3>: mov 0xc(%ebp),%eax ebp+0c == pSrc
0x0804844e <strcopy+6>: movzbl (%eax),%edx edx = *pSrc

0x08048451 <strcopy+9>: mov 0x8(%ebp),%eax ebp+8 == pDst
0x08048454 <strcopy+12>: mov %dl,(%eax) *pDst = *pSrc

0x08048456 <strcopy+14>: mov 0x8(%ebp),%eax
0x08048459 <strcopy+17>: movzbl (%eax),%eax
0x0804845c <strcopy+20>: test %al,%al *pDst != '\0'
0x0804845e <strcopy+22>: setne %al set not equal
0x08048461 <strcopy+25>: addl $0x1,0x8(%ebp) pDst++
0x08048465 <strcopy+29>: addl $0x1,0xc(%ebp) pSrc++
0x08048469 <strcopy+33>: test %al,%al setne에 의한 set 검사
0x0804846b <strcopy+35>: jne 0x804844b <strcopy+3>

2010/12/08  
schcp91 그렇죠?? 데이터가 이동되는 거니까~!
으음..~
근데 디버깅은............ 음~?
좀 배워야 겠네요 -0 ㅋㅋㅋㅋㅋㅋㅋㅋ
근데 *pDst != '\0' 라고 되어있는 걸 보니
뭘 말하는 지는 알 듯-0
디게 감사!!!
2010/12/08