Пример для strncpy () - PullRequest
       2

Пример для strncpy ()

0 голосов
/ 11 апреля 2019

Если бы я использовал функцию strncpy для строк cat и dog.Я не понимаю, учитывается ли символ \0 или нет, поэтому я хотел бы знать, будет ли конечный результат catdo?или это будет что-то вроде cat\0do

strncpy("cat", "dog", 2);

Ответы [ 3 ]

0 голосов
/ 11 апреля 2019

Как упоминалось в torstenvl, "cat" и "dog" являются строковыми литералами, поэтому здесь вы не используете функцию правильно.Первый параметр - это место назначения, второй параметр - это источник, а третий параметр - количество копируемых байтов.

char *strncpy(char *restrict s1, const char *restrict s2, size_t n)

Источник: Базовая спецификация открытой группы - strncpy

Чтобы ответить на ваш конкретный вопрос: да;нулевой терминатор копируется в строку назначения.n байтов записывается, и если ваша исходная строка s2 короче n байтов, NULL заполняется до тех пор, пока не будет записано n байтов.

В вашем вопросе это выглядит такВы пытаетесь добавить две строки.Чтобы сделать это в C, вам нужно сначала выделить буфер исходной строки, скопировать первую строку, а затем скопировать вторую строку, начиная с конца второй строки.В зависимости от того, где вы начнете последний шаг, вы можете указать «catdog \ 0» или «cat \ 0dog \ 0».Это еще один пример типичной ошибки «выключено одним».

Для начала вам нужно рассчитать длину двух строк, которые вы хотите добавить.Вы можете сделать это, используя strlen, от string.h.strlen не не считает нулевой терминатор как часть длины, поэтому помните, что для получения длины последней строки вам нужно будет сделать strlen(s1) + strlen(s2) + 1.

Затем вы можете скопировать первую строку, как обычно.Самый простой способ сделать вторую копию - это сделать:

char* s2start = finalString[strlen(s1) + 1];

Затем вы можете сделать strncpy(s2start, s2, [the size of s2]), и тогда вы поймете, что начинаете прямо с нулевого терминатора s1, избегая "cat \"Ошибка 0dog.

Надеюсь, это поможет, удачи.

0 голосов
/ 11 апреля 2019

Вы не должны использовать функции strncpy и strncat вообще.

Их имена начинаются с str, но на самом деле они не работают со строками. В C строка определяется как «последовательность символов, оканчивающаяся на '\0'». Эти функции не гарантируют, что результирующий массив символов всегда будет заканчиваться нулем.

Лучшими альтернативами являются strlcpy и strlcat, но они доступны не везде.

Еще лучше было бы создать отдельную библиотеку строк, в которой определение длины строки выполнялось в постоянном времени. Но это отвлекает.

0 голосов
/ 11 апреля 2019

Когда вы записываете строку типа "cat" или "dog" в c, массивы не могут быть изменены, если вы попытаетесь, это приведет к неопределенному поведению. Вы можете использовать их, только если функция ожидает, что const char * input, const говорит вам, что она не может / не будет изменена в функции. Когда вы пишете "dog", данные в массиве символов будут выглядеть примерно так:

{'d','o','g','\0'}

Обратите внимание, что NUL прекращено.

Используемая вами функция:

char *strncpy(char *dest, const char *src, size_t n)

Копирует src в dst с максимальной длиной n, которую нельзя скопировать в "cat", как упоминалось выше, вы можете видеть, что char *dest не является константой, а const char * src является константой. Таким образом, источник может быть "cat" или "dog"

Если вам нужно выделить место для строки, вы можете изменить ее:

char cat_str[] = "cat";

теперь массив символов cat_str инициализируется на "cat", но мы всегда можем изменить его, обратите внимание, что его длина будет 4 (по одному для каждой буквы плюс NUL), потому что мы не указали длину. Поэтому убедитесь, что ничего не изменилось после cat_str [3], вы можете проиндексировать его от 0 до 3

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