Null завершение строки

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

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

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

buffer[end_position] = 0; 

Ответ 4

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

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