2013-12-09 38 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

如果你想要,你可以在一行写... –

+0

如果它似乎工作,那么这应该去codereview.stackexchange.com。那么,代码的工作?如果不是你面对什么问题,请吗? – alk

+0

@alk你一定没有看过它。它有一些严重的问题。 –

回答

1

你必须与你的代码的问题:你对'\0'测试src本身,而不是它指向的char

while (src != '\0'); 

应该

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

首先得到它的权利,然后把它短/快。


您正在撰写有关本页面全部是异常安全的信息。由于您使用C语言,因此没有像例外(与C++相反)等本地语言概念。

不管怎么说,例外的是你的代码可以提高的唯一类型是硬件异常缺页堆栈故障对准检查 ...)无法通过正常的被抓C++ try-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

好吧我纠正它 但我能做些什么来确认函数的工作原理并返回每个输入的输出,除了例外情况外,还会有其他的输入吗 谢谢 – user3082112

+0

@ user3082112需要对输入(arg指针)进行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

应该是'==',对吧?无法将值分配给值... –