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 не предназначен для использования в завершающих строках.