执行处理异常的strcpy和strcat

时间:2013-12-09 15:58:03

标签: c strcpy strcat

我必须在7行代码中编写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') ;
}

2 个答案:

答案 0 :(得分:1)

您的代码存在问题:您正在针对src测试'\0',而不是针对char。{/ p>

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参数来指示目标缓冲区的大小,以便您可以有效地检测并防止缓冲区溢出。

答案 1 :(得分: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;
}