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;
}
На ваш первый вопрос:
Я бы согласился с комментарием Paul R и завершил '\0'
. Но и само значение 0
тоже прекрасно работает. Дело вкуса. Но не используйте MACRO NULL
, который предназначен для указателей.
На ваш второй вопрос:
Если ваша строка не завершается символом \0
, она все равно может вывести ожидаемый результат, потому что за строкой следует непечатаемый символ в вашей памяти. Однако это действительно неприятная ошибка, так как она может взорваться, когда вы этого не ожидаете. Всегда завершайте строку символом '\0'
.
Будьте очень осторожны: NULL - это макрос, используемый в основном для указателей. Стандартный способ завершения строки :
char *buffer;
...
buffer[end_position] = '\0';
Это (ниже) также работает, но это не большая разница между присвоением целочисленного значения массиву int / short / long и присвоением символьного значения. Поэтому предпочтение отдается первой версии, и лично мне она нравится больше.
buffer[end_position] = 0;
Из FAQ по comp.lang.c: http://c-faq.com/null/varieties.html
По сути: NULL
(макрос препроцессора для нулевого указателя) - это не то же самое, что NUL
(символ нуля).
'\0' - это то, что нужно. Это символ, который нужен в строке и имеет нулевое значение.
Когда мы говорим "строка с нулевым окончанием" в C/C++, на самом деле это означает "строка с нулевым окончанием". Макрос NULL не предназначен для использования в терминировании строк.