C 0600在函数中是什么意思?与\200相同吗?

C 0600在函数中是什么意思?与\200相同吗?,c,ascii,octal,C,Ascii,Octal,我正在尝试自己编写memccpy()函数。我会打电话给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

我正在尝试自己编写memccpy()函数。我会打电话给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 with\200inside !";
    int n = 21;

    memccpy(dest2, src, '\200', n);
    printf("%s\n", dest2);
    ft_memccpy(dest, src, '\200', n);
    printf("%s\n", dest);
}
#包括“ft_memccpy.c”
#包括
#包括
int main()
{
char dest[]=“abcdefghijklmnopqrstuvwxyz”;
char dest2[]=“abcdefghijklmnopqrstuvwxyz”;
char src[]=“内部带有\200的字符串!”;
int n=21;
memccpy(dest2,src,'\200',n);
printf(“%s\n”,dest2);
ft_memccpy(目的地,src,'\200',n);
printf(“%s\n”,dest);
}
这里是第二个测试(test2),我的函数不起作用:

#include "ft_memccpy.c"
#include <stdio.h>
#include <string.h>
int main()
{
    char dest[] = "abcdefghijklmnopqrstuvwxyz"; 
    char dest2[] = "abcdefghijklmnopqrstuvwxyz"; 
    char src[] = "string with\200inside !";
    int n = 21;

    memccpy(dest2, src, 0600, n);
    printf("%s\n", dest2);
    ft_memccpy(dest, src, 0600, n);
    printf("%s\n", dest);
}
#包括“ft_memccpy.c”
#包括
#包括
int main()
{
char dest[]=“abcdefghijklmnopqrstuvwxyz”;
char dest2[]=“abcdefghijklmnopqrstuvwxyz”;
char src[]=“内部带有\200的字符串!”;
int n=21;
memccpy(地址2,src,0600,n);
printf(“%s\n”,dest2);
ft_memccpy(目的地,src,0600,北);
printf(“%s\n”,dest);
}
我算出0600是八进制,十进制应该是384, 但是384不是ascii码,对吗?
关于0600,我得到的唯一信息是“chmod 0600”,它似乎不相关。
sptr
是一个
char
数组,因此需要将
c
int
转换为
char
,这样等式才有意义:

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

sptr
是一个
char
数组,因此您需要将
c
int
转换为
char
,这样等式才有意义:

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

将比较转换为使用
无符号字符

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
,类似字符串的函数也倾向于只使用字符值。因此,
c
as 0600(38410)应仅使用0200(12810)来比较常见的8位
无符号字符

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;
}

执行
unsigned char
而不是
char
signed char
也很重要。在这种情况下,它避免实现定义的行为将
int
转换为有符号
char
,并使用罕见的non-2补码来避免陷阱,并且不会将+0比较为-0。

将比较转换为使用
无符号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
,类似字符串的函数也倾向于只使用字符值。因此,
c
as 0600(38410)应仅使用0200(12810)来比较常见的8位
无符号字符

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;
}

执行
unsigned char
而不是
char
signed char
也很重要。在这种情况下,它避免实现定义的行为将
int
转换为带符号的
char
,并使用罕见的非-2补码来避免陷阱,并且不会将+0与-0进行比较。

正确。0600是八进制600。带前导零的数字是。即
0600
6*8²+0*8+0*8⁰
=
384
@selbie:
memccpy
将其第三个参数转换为
无符号字符
。0600是二进制的110-000-000。9位通常不适合于8位字符,因此您只剩下10-000-000。那是0200。这并没有因为你的函数而改变,第9位被编译器砍掉了。无需诊断,理想情况下它会警告您。@selbie:将参数转换为
无符号字符
memccpy
规范的一部分。如果
ft_memccpy
不这样做,则它有缺陷。正确。0600是八进制600。带前导零的数字是。即
0600
6*8²+0*8+0*8⁰
=
384
@selbie:
memccpy
将其第三个参数转换为
无符号字符
。0600是二进制的110-000-000。9位通常不适合于8位字符,因此您只剩下10-000-000。那是0200。这并没有因为你的函数而改变,第9位被编译器砍掉了。无需诊断,理想情况下它会警告您。@selbie:将参数转换为
无符号字符
memccpy
规范的一部分。如果
ft_memccpy
不这样做,则它有缺陷。