2013-12-09 4 views
0

코드 7 행에 strcpy()strcat()을 써야하고 예외가있을 수 있습니다. 지금까지 내 코드입니다. 누구나 줄 수를 줄이는 방법에 대한 제안이 있습니까?예외를 다루는 strcpy와 strcat의 구현

char *mystrcpy(char *dst, const char *src) 
{ 
    char *ptr; 
    ptr = dst; 
    while(*dst++=*src++); 
    return(ptr); 
} 

void strcat(char *dest, const char *src) 
{ 

    while (*dest!= '\0') 
     *dest++ ; 
    do 
    { 
     *dest++ = *src++; 
    } 
    while (src != '\0') ; 
} 
+5

당신은 작동하는 것 같다면,이 codereview.stackexchange.com로 이동합니다 ... 한 줄에 –

+0

을 기록 할 수 있습니다. 코드가 작동합니까? 무슨 이슈가 아니라면, 제발? – alk

+0

@alk 당신은 그것을 보아서는 안됩니다. 심각한 문제가 있습니다. –

답변

1

당신은 당신의 코드에 문제가 : 당신은에 가리키는 char'\0'에 대해 자신을 src 테스트하고 있지 않습니다.

while (src != '\0'); 

는 고속 /가 짧은 얻을

while (*src != '\0'); 

먼저 바로 그것을 얻을 수 있어야합니다.


이 페이지 전체에서 예외 안전성에 대해 쓰고 있습니다. C를 사용하고 있으므로 예외 (예 : C++이 아닌)와 같은 모국어 개념이 없습니다.

어쨌든, 당신의 코드를 올릴 수있는 예외의 유일한 유형은 하드웨어 예외는 정상에 의해 체포 될 수 없다 (페이지 오류, 스택 오류, 정렬 검사, ...)입니다 C++ try-catch. 하드웨어 예외 처리는 플랫폼에 따라 다르므로 플랫폼 특정 메커니즘을 사용하여이를 catch해야합니다 (Windows의 경우 SEH, Unix의 경우 signal handler). 이 접근법은 내가 추천 한 것은 아니지만,을 읽으십시오.

하드웨어 예외를 포착하는 것보다 훨씬 나은 방법은 시도하지 않는 것이 좋습니다. 귀하의 코드에서 이것은 단지 != 0에 대한 입력 포인터를 테스트하는 것을 의미합니다. char* dst = 0xDEADBEEF;과 같은 유효하지 않은 포인터를 식별 할 기회가 없으며 액세스 한 후에 예외를 처리 할 수있는 유일한 방법은 위에서 언급 한 것과 같은 플랫폼 종속 코드입니다. 그러나 이와 같은 하드 오류는 일반적으로 프로그램에서 처리해서는 안됩니다.

예 :

// Returns the new string length, or -1 on error. 
int strcat(char* dst, char const* src) 
{ 
    // Check arguments before doing anything. 
    if (dst == 0) 
     return -1; 
    if (src == 0) 
     return -1; 

    // Store begin of destination to compute length later on. 
    char const* const dstBegin = dst; 

    // Skip to end of destination. 
    while (*dst != '\0') 
     *dst++ ; 

    // Copy source to destination. 
    do 
    { 
     *dst++ = *src++; 
    } 
    while (*src != '\0'); 

    // Return new length of string (excluding terminating '\0'). 
    return (dst - dstBegin - 1); 
} 

가 선택적으로 당신은 당신이 효과적으로 탐지하고 버퍼 오버 플로우를 방지 할 수 있도록 대상 버퍼의 크기를 나타내는 것 dstSize 매개 변수를 도입 할 수있다. 당신이 원하는 경우

+0

괜찮겠습니다. 하지만 func가 작동하는지 확인하고 예외를 제외하고 내가 수행 할 모든 입력에 대해 출력을 반환 할 수 있습니까? 누군가 도움을 줄 수 있습니까? 감사합니다. – user3082112

+0

@ user3082112는 입력 (NULL 포인터)의 NULL 검사가 필요합니다. – BLUEPIXY

+0

잘못된 입력의 경우는 무엇입니까? dst user3082112

1
char *mystrcpy(char *dst, const char *src){ 
    return (*dst=*src) ? (mystrcpy(dst+1, src+1), dst) : dst; 
} 
char *mystrcat(char *dst, const char *src){ 
    return (*dst ? mystrcat(dst+1, src) : mystrcpy(dst, src)), dst; 
} 
+0

'* dst = * src 컴파일 오류입니까? –

+0

@BitFiddlingCodeMonkey 오류가 없습니다. – BLUEPIXY

+0

해야합니다. '==', 맞죠? 값에 값을 할당 할 수 없습니다 ... –