你必须与你的代码的问题:你对'\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
参数将指示目标缓冲区的大小,这样就可以有效检测并防止缓冲器溢出。
如果你想要,你可以在一行写... –
如果它似乎工作,那么这应该去codereview.stackexchange.com。那么,代码的工作?如果不是你面对什么问题,请吗? – alk
@alk你一定没有看过它。它有一些严重的问题。 –