c-0600在函数中是什么意思?它和200英镑一样吗



我正在尝试自己编写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而不是charsigned char也很重要。在这种情况下,它避免了实现定义的行为int转换为有符号char,并使用罕见的非2补码来避免陷阱,并且不将+0与-0进行比较。

sptrchar的数组,因此需要将cint转换为char,以便相等的值有意义:

...
if (*sptr == (char) c)
...

相关内容