Что означает 0600 в функции? Это так же, как \ 200? - PullRequest
1 голос
/ 28 февраля 2020

Я пытаюсь написать функцию 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);
}

и вот второй тест (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);
}

Я выяснил, что 0600 восьмерично и должно быть 384 в десятичном виде, но 384 не в коде ascii правильно? Единственное, что я получаю около 0600, это «chmod 0600», который не выглядит актуальным.

Ответы [ 2 ]

4 голосов
/ 28 февраля 2020

Преобразовать сравнение для использования 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. Таким образом, c как 0600 (384 10 ) должен использовать только 0200 (128 10 ) для сравнения для обычного 8-битного unsigned char.

Выполнение unsigned char, а не char или signed char тоже важно. В этом случае он избегает поведения, определенного реализацией преобразования int в со знаком char и с редким дополнением, отличным от 2, чтобы избежать ловушек и не сравнивать +0 как -0.

1 голос
/ 28 февраля 2020

sptr - это массив char, поэтому вам нужно преобразовать c из int в char, чтобы иметь значение:

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