Сдвиг буфера через memcpy - PullRequest
3 голосов
/ 24 июня 2011

Я написал следующие 2 функции ltrim (функция, которая удаляет пробелы с левой стороны строки):

1 .(поместив здесь этот код, чтобы не получить такой код в качестве ответа)

void ltrim(char * str, int size)
{
    char const *start = str;
    char const *end = start + size;
    for(;*start && (*start==' ' || *start=='\n' || *start=='\r' || *start=='\t');++start);

    while(start != end)
    {
        *str = *start;
        ++start;
        ++str;
    }
    *str='\0';
}

2 .

void ltrim(char * str, int size)
{
    char const *start = str;
    char const *end = start + size;
    for(;*start && (*start==' ' || *start=='\n' || *start=='\r' || *start=='\t');++start);
    memcpy(str, start, end-start);
    *(str + (end - start)) = '\0';
}

Безопасна ли вторая версия?

PS Я пробовал, и это работает, но я не уверен, что memcpy безопасен в этом случае.

Ответы [ 3 ]

12 голосов
/ 24 июня 2011

Когда источник и пункт назначения перекрываются, следует использовать memmove вместо memcpy .

Со страницы руководства memcpy:

The memcpy() function copies n bytes from memory area src to memory area dest. The memory areas should not overlap. Use memmove(3) if the memory areas do overlap.

0 голосов
/ 24 июня 2011
    memcpy(str, start, end-start);

Если вы memmove (см. ответ Пола Р. ) еще на 1 символ, этот дополнительный символ является нулевым терминатором.

0 голосов
/ 24 июня 2011

Относительно «безопасного» - вы пропустили один важный случай - проверку того, что вы не переполняете буфер.Используйте этот параметр size, чтобы ограничить цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...