2017-12-20 9 views
3

이 코드를 읽는 데 디버거를 사용하고 있는데 약간 혼동 스럽습니다. while ((*d++ = *s2++)); - 디버거 변수에서 d가 각 루프 이후에 짧아지는 것 같습니다 'Hello hello'에서 'ello hello'까지이고 s1'cello hello'으로 바뀝니다. 반복 루프 루핑이란 무엇입니까? while(condition); do(something))?C :이 코드의 while 루프에서 포인터를 이해하는 데 문제가 없습니다.

d와 s1의 변수 값이 같지 않은 이유는 무엇입니까 (d는 s1에 대한 포인터가 아닙니까)? ? 주요 기능은,이 strcpy()의 다소 전형적인 교훈 구현

/*  
    Input: char pointers for source (s2) and destination (s1) 

    Output: returns the pointer to the destination (s1) 
*/ 

char *my_strcpy(char * , const char *); 

int main() 
{ 

    char src[] = "cs23!"; 
    char dst[]="Hello hello"; 
    char *curdst; 
    int len=0; 

    while(src[len++]); 

    // do the copy 

    curdst= my_strcpy(dst, src); 

    // check to see if the NULL char is copied too. 

    printf("dst array %s and last element %d\n", dst, atoi(&dst[len])); 

    return 0; 

} 

char *my_strcpy(char *s1, const char *s2) { 

    register char *d = s1; 

    // print the pointer variables address and their contents, and first char 

    printf("s2 address %p, its contents is a pointer %p to first char %c \n", (void *)&s2, (void *)s2, *s2); 
    printf("s1 address %p, its contents is a pointer %p to first char %c \n", (void *)&s1, (void *)s1, *s1); 

    while ((*d++ = *s2++)); 
    return(s1); 

} 
+2

'* D * S2 = ++ ++'매우 다르다 '* D * S2 == ++ ++'. 여기서's2'의 널 종결자가 될 때까지'* d2 '의 값을'* s2'의 값으로 덮어 쓰게됩니다. – hnefatl

+0

조건은'* s2'가 0 (문자열 널 종결 자)이 아닌 것입니다. –

+1

유사한 것의 분류에 대해서는 [이 답변] (https://stackoverflow.com/a/20957532/2201041)을 참조하십시오. – JETM

답변

2

curdst = dst의 포인터이다 그것은 다음과 같이 작동합니다..

  • my_strcpy()는 두 개의 인수를 첫 번째 인수가 목적지 문자 배열의 첫 번째 요소에 대한 포인터. 두 번째 인수는 소스 문자열의 첫 번째 요소 (NUL (aka \0) 문자로 끝나는 문자 배열을 가리키는 포인터입니다. 함수는 소스 문자열의 문자를 NUL 종결자를 포함하여 대상 버퍼에 복사하고 대상 버퍼의 첫 번째 요소에 대한 포인터를 반환합니다. 우리는 복사가 완료된 후 반환해야하기 때문에

    char *my_strcpy(char *s1, const char *s2) { 
    
  • 것부터 먼저, 첫 번째 인수의 복사본을 만듭니다.

    char *d = s1; 
    
  • 그런 다음 문자를 복사하십시오. 이것은 다음과 같이 작동 꽉 루프에서 수행됩니다

    • 복사 장소 * s2* d = * s2을 실행하는 것처럼, d가 가리키는 현재의 문자;
    • 을 실행하여 마치 d++을 실행하는 것처럼 대상 버퍼의 다음 위치를 가리키고 s2을 증분하여 복사 할 다음 문자를 가리 키도록 만듭니다. s2++;
    • 복사 된 마지막 문자가 NUL 인 경우 루프를 종료하십시오.

    이는 아주 간결한 방식으로 기록됩니다

    while (* d++ = * s2++); 
    

    * s2++은 "캐릭터가 다음 s2을 증가 s2에 의해 지시 받아"를 의미한다. 유사하게 * d++은 왼쪽 값으로 "d이 가리키는 변수 사용"을 의미하고 d을 증가시킵니다. ++은 우선 순위가 *이고 우선 순위가 =이기 때문에 연산자의 우선 순위는 괄호로 처리하는 데 도움이됩니다. 할당 값은 할당 된 값이므로 할당 된 문자의 값이 0 일 때 루프가 끝납니다.

  • 마지막으로 함수에 의해 변경되지 않은 s1을 반환합니다.

    return s1; 
    } 
    
참고
+0

감사합니다! '* d'가's1'을 바꾸면's1'을 반환 할 때 s2를 s1에 복사 했습니까? –

+0

@helloworld :'s2'가 가리키는 문자열을's1'이 가리키는 버퍼에 복사했습니다. – AlexP