2013-02-15 2 views
0

나는 프로그램을 찾기 위해 몇 시간 동안 내 프로그램을 찢어 놓았다. 나는 마침내 몇 줄의 코드로 제한했지만 아직도이 문제를 찾기 위해 여전히 어리 석다.포인터 함수가있는이 strcpy의 문제점은 무엇입니까?

모두 포인터를 사용하는 문자열 복사 기능입니다. 누군가 그것을 살펴볼 수 있습니까?

void stringCopy(char *sourcePtr, char *destPtr) 
{ 
    while(*sourcePtr!='\0') 
    { 
     *destPtr=*sourcePtr; 
     destPtr++; 
     sourcePtr++; 
    } 
} 

문자열의 한계를 벗어난 것처럼 내 문자열에 가비지 값을 주입하고 있습니다.

또한, 단지 20 모두가 하드 코드 선언 된 소스 및 목적지 어레이는 크기가 10 미만 길이의 문자열을 복사하기 위해 사용된다.

나는 strcpy를 사용할 것이다. 그러나 이것은 클래스에 대한 할당이며 허용되지 않는다.

편집 : 최종 null char을 대상에 입력하는 것을 잊어 버렸습니다! 모든 문제를 일으켜서 미안해, 얘들 아!

+0

sourcePtr에 destPtr을 모두 저장할 공간이 충분합니까? – monoxygen

+3

왜 strcpy를 사용하지 않는가? – monoxygen

+0

가능하면 디버거를 사용하여 변수를 확인하십시오. – NeonGlow

답변

4

간단한 strcpyX() 기능 :

void strcpyX(char *dest, const char *src){ 
    while(*src) *dest++ = *src++; 
    *dest = '\0'; 
} 

이는 대상에 대한 충분한 공간을 확보에만 활용할 수 있습니다.

목적지도 올바르게 인쇄하려면 '\0' (현재 코드에 포함되어 있지 않음)으로 종료되어야합니다! 코드에서

0

유일한 문제는 당신의 목적지에 '\0' 복사되지 않습니다. 아래의 코드는 완벽하게 작동합니다.

/* strcpy: copy t to s */ 
void strcpy(char *s, char *t) 
{ 
    while ((*s = *t)!=‘\0’) { 
     s++; 
     t++; 
    } 
} 
3

종료 문자를 복사하지 못했습니다. 이 기능은 수정시

*destPtr = 0; 

으로 해결할 수 있습니다.

그러나 내 눈에는 다음이 가장 간단한 strcpy 스타일 함수입니다. 내가 올바르게 기억이 버전은 종단 NUL을 복사 한 후에 만 ​​중단, 전체 문자열을 복사합니다

void stringCopy(char *sourcePtr, char *destPtr) { 
    while(*destPtr++ = *sourcePtr++) 
     ; 
} 

이 R.

K &에 출연했다.

+0

대부분의 프로그래머가 이해하기 힘든 경우에도 이것은 깔끔합니다. 게다가 변태가되어 안전하지 않은 16 진수의 비트는 저항 할 수 없게 만듭니다. –