пустой указатель, завершающий строку

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;
}
27
задан Brian 21 September 2015 в 20:10
поделиться

4 ответа

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

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

36
ответ дан 28 November 2019 в 04:30
поделиться

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

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

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

buffer[end_position] = 0; 
13
ответ дан 28 November 2019 в 04:30
поделиться

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

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

17
ответ дан 28 November 2019 в 04:30
поделиться

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

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

7
ответ дан 28 November 2019 в 04:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: