我正在尝试自己编写memccpy((函数。我将调用is ft_memccpy((。我在网上找到了测试的主要功能,有两个测试功能让我感到困惑。第一个测试函数与我的ft_memccpy((配合良好,但第二个测试函数则不然。我不明白,因为test1和test2之间的唯一区别是\200改为0600。
这是我制作的ft_memccpy:
void *ft_memccpy(void *dest, const void *src, int c, size_t n)
{
char *dptr;
char *sptr;
dptr = (char *)dest;
sptr = (char *)src;
while (n && *dptr && *sptr)
{
*dptr = *sptr;
if (*sptr == c)
{
return (++dptr);
}
dptr++;
sptr++;
n--;
}
return (0);
}
这是我的函数运行良好的第一个测试函数(test1(:
#include "ft_memccpy.c"
#include <stdio.h>
#include <string.h>
int main()
{
char dest[] = "abcdefghijklmnopqrstuvwxyz";
char dest2[] = "abcdefghijklmnopqrstuvwxyz";
char src[] = "string with200inside !";
int n = 21;
memccpy(dest2, src, '200', n);
printf("%sn", dest2);
ft_memccpy(dest, src, '200', n);
printf("%sn", dest);
}
这是我的功能不起作用的第二个测试(test2(:
#include "ft_memccpy.c"
#include <stdio.h>
#include <string.h>
int main()
{
char dest[] = "abcdefghijklmnopqrstuvwxyz";
char dest2[] = "abcdefghijklmnopqrstuvwxyz";
char src[] = "string with200inside !";
int n = 21;
memccpy(dest2, src, 0600, n);
printf("%sn", dest2);
ft_memccpy(dest, src, 0600, n);
printf("%sn", dest);
}
我算出0600是八进制,应该是384十进制,但是384不在ascii代码中,对吧?我得到的关于0600的唯一信息是"chmod 0600",这似乎并不相关。
转换比较以使用unsigned char
。
void *ft_memccpy(void *dest, const void *src, int c, size_t n) {
unsigned char *dptr = (unsigned char *) dest;
// better style to not cast away const-ness
const unsigned char *sptr = (const unsigned char *) src;
while (n && *dptr && *sptr) {
*dptr = *sptr;
if (*sptr == (unsigned char)c) {
return (++dptr);
}
dptr++;
sptr++;
n--;
}
return 0;
}
即使参数为int
,类似字符串的函数也倾向于只使用字符值。因此,作为0600(38410(的c
应该仅使用0200(128<10>(来比较公共8位unsigned char
。
执行unsigned char
而不是char
或signed char
也很重要。在这种情况下,它避免了实现定义的行为将int
转换为有符号char
,并使用罕见的非2补码来避免陷阱,并且不将+0与-0进行比较。
sptr
是char
的数组,因此需要将c
从int
转换为char
,以便相等的值有意义:
...
if (*sptr == (char) c)
...