нулевое завершение строки - PullRequest
26 голосов
/ 26 мая 2010

gcc 4.4.4 c89

Каким стандартным способом завершить строку нулем? Когда я использую NULL, я получаю предупреждение.

*dest++ = 0; 
*dest++ = '\0'; 
*dest++ = NULL; /* Warning: Assignment takes integer from pointer without a cast */

Исходный код:

size_t s_strscpy(char *dest, const char *src, const size_t len)
{
    /* Copy the contents from src to dest */
    size_t i = 0;
    for(i = 0; i < len; i++)
    *dest++ = *src++;

    /* Null terminate dest */
     *dest++ = 0; 

    return i;
}

Другой вопрос: я намеренно закомментировал строку, заканчивающуюся нулем. Тем не менее, он по-прежнему правильно распечатал содержимое Dest. Вызывающий эту функцию отправит длину строки, либо включив NULL, либо нет. т.е. strlen(src) + 1 или stlen(src).

size_t s_strscpy(char *dest, const char *src, const size_t len)
{
    /* Copy the contents from src to dest */
    size_t i = 0;
    /* Don't copy the null terminator */
    for(i = 0; i < len - 1; i++)
    *dest++ = *src++;

    /* Don't add the Null terminator */
    /* *dest++ = 0; */

    return i;
}

Ответы [ 4 ]

35 голосов
/ 26 мая 2010

На ваш первый вопрос: Я бы согласился с комментарием Пола Р. и закончил бы с '\0'. Но само значение 0 тоже отлично работает. Дело вкуса. Но не используйте MACRO NULL, который предназначен для указателей.

На ваш второй вопрос: Если ваша строка не оканчивается на \0, она все равно может вывести ожидаемый результат, потому что следующая строка является непечатным символом в вашей памяти. Это действительно неприятная ошибка, поскольку она может взорваться, если вы этого не ожидаете. Всегда завершать строку с '\0'.

17 голосов
/ 26 мая 2010

Из comp.lang.c FAQ: http://c -faq.com / null / variety.html

По сути: NULL (макрос препроцессора для нулевого указателя) не совпадает с NUL (нулевой символ).

13 голосов
/ 26 мая 2010

Be очень осторожно: NULL - это макрос, используемый в основном для указателей. стандартный способ завершения строки:

char *buffer;
...
buffer[end_position] = '\0';

Это (ниже) работает, но это не большая разница между назначением целочисленного значения массиву int / short / long и назначением значения символа Вот почему первая версия предпочтительнее, и лично мне она нравится больше.

buffer[end_position] = 0; 
7 голосов
/ 26 мая 2010

'\ 0' - путь. Это символ, который требуется в строке и имеет нулевое значение.

Когда мы говорим строку с нулевым символом в Си / Си ++, это действительно означает «строка с нулевым символом в конце» Макрос NULL не предназначен для использования в завершающих строках.

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