【发布时间】:2022-09-27 19:03:27
【问题描述】:
我正在编写 strlcat 的重新实现作为练习。我已经进行了几次测试,它们产生了类似的结果。但是在一个特殊情况下,我的函数给出了分段错误错误,而原来的函数没有,你能解释一下为什么吗?我不允许使用任何标准库函数,这就是我重新实现 strlen() 的原因。
这是我写的代码:
#include <stdio.h>
#include <string.h>
int ft_strlen(char *s)
{
int i;
i = 0;
while (s[i] != \'\\0\')
i++;
return (i);
}
unsigned int ft_strlcat(char *dest, char *src, unsigned int size)
{
size_t i;
int d_len;
int s_len;
i = 0;
d_len = ft_strlen(dest);
s_len = ft_strlen(src);
if (!src || !*src)
return (d_len);
while ((src[i] && (i < (size - d_len - 1))))
{
dest[i + d_len] = src[i];
i++;
}
dest[i + d_len] = \'\\0\';
return (d_len + s_len);
}
int main(void)
{
char s1[5] = \"Hello\";
char s2[] = \" World!\";
printf(\"ft_strcat :: %s :: %u :: sizeof %lu\\n\", s1, ft_strlcat(s1, s2, sizeof(s1)), sizeof(s1));
// printf(\"strlcat :: %s :: %lu :: sizeof %lu\\n\", s1, strlcat(s1, s2, sizeof(s1)), sizeof(s1));
}
使用 strlcat 的输出是:strlcat :: Hello World! :: 12 :: sizeof 5。我在 macOS 上,如果有帮助的话,我正在使用 clang 进行编译。
-
可能与
sizeof有关,字符串缓冲区总是比字符串缓冲区的strlen()返回的长度大1。在调试器中单步执行代码时,仔细检查dest[i + d_len] = src[i];和while ((src[i] && (i < (size - d_len - 1))))中的i的值。 -
使用
size_t而不是int或unsigned int。 -
s1[5]数组不足以容纳\"Hello\"- 这需要 6 个字符(一个用于空终止符)。 -
声明
char s1[5] = \"Hello\";是有效的(在 C 中)但它不会在数组中包含 nul 终止符。那是必需的对于几乎所有使用字符串的 C 函数。 -
特别是,
strlcat()需要它,因为strlen(dest)会查找它。
标签: c function segmentation-fault