2015-01-20 7 views
2

숙제를 위해 string.h 라이브러리 (2fun2handle)의 22 개 함수를 모두 구현해야합니다. 나는 많은 함수를 사용했지만 strcpy를 구현하려고 할 때 약간의 문제가 발생한다. C에서 strcpy를 구현할 때의 문제

char *new_strcpy(char *dest, const char *src){ 
    char *copy = (char *) src; 
    for(; *copy != '\0'; ++copy, ++dest) 
     *dest = *copy; 
    return dest; 
} 

내가이 잘 작동 것이라고 생각 :

적지 개정 한 후, 여기에 기능에 나의 시도이다. 이 같은 간단한 예제를 수행하여 내 코드를 테스트 할 때, :

char src[50], dest[50]; 
new_strcpy(src, "src"); 
new_strcpy(dest, "dest"); 
printf("dest: %s\n", dest); 
printf("src: %s\n", src); 

내 출력은 다음과 같이 찾고 끝 :

dest: dest$ 
src: src$$$$ 

그냥 같이해야하는 경우 :

dest: dest 
src: src 

이 함수를 구현하기 전에, 문제없이 포인터를 사용하여 src 문자열을 dest 문자열에 복사했습니다. 그래서 왜 이런 일이 발생하는지 잘 모르겠습니다. 내가 잘못하고있는 것이 명백한가요? 또한

+1

당신은 아니야 널 종료 대상을 - 루프 휴식과 당신을 위해 널 (null)을 절대로 복사하지 마십시오. – Katie

+0

루프 이후에 명시 적으로 또는 do ... while을 사용하여 문자열을 널 종료해야합니다. 'strcpy'는'dest'의 (초기 값)을 반환합니다. 포인터를'dest' 문자열의 끝으로 되돌립니다 (더 유용한 반환 값이 될 수도 있습니다). –

+0

정말 질문에 대답하지 않지만 strcpy의이 방법은 정말 멋지다. while (* dest ++ = * srC++); – Atuos

답변

5

. 내가 while 루프와 함께이 일을하고 *copy가 빌 때까지 반복하고, 내가 전달받을 원래 *dest*src 인수를 통해 반복 직접 시도했습니다 해봤 있습니다 당신은 실제 문자열로 표시되지 않습니다 특별의 제로 문자 사용하여 완료 :

char *new_strcpy(char *dest, const char *src){ 
    char *copy = (char *) src; 
    for(; *copy != '\0'; ++copy, ++dest) 
     *dest = *copy; 
    *dest=0; 
    return dest; 
} 

참고가 copy 변수가 필요하지 않습니다, 그것은 컴파일러가 당신을 위해 제거 단지 쓰레기입니다.

편집 : 다음의 요청에 따라, const을 멀리 던져 덜 장황하지 않는 고전 strcpy 기능이 될 때 :

char *new_strcpy(char *dest, const char *src) 
{ 
    char *ret = dest;   // needed to return, useless as this is 
    while(*dest++ = *src++);  // straight byte copy, very unoptimized 
    //*dest=0;     // no longer needed since the copy happens before the check now 
    return ret;     // and return the original buffer (note that you were returning the end) 
} 
+1

'const' 한정자를 버리는 것은 매우 나쁜 습관입니다. 당신이'copy' 변수가 필요 없다는 것이 맞으므로, 그것없이 함수를 작성하는 방법을 보여줄 것을 제안합니다. – user3386109

+0

실제로'* dest = 0'은 실제로 종료 문자로 작동합니까 아니면' '\ 0''을 사용해야합니까? – Alex

+0

@Alex''\ 0'''은 '0'에 해당하는 문자 표현입니다. – clcto