Разница между strncpy и snprintf? - PullRequest
3 голосов
/ 13 марта 2019

В чем разница между

strncpy(dst, src, n)

и

snprintf(dst, n "%s", src)

Следует ли мне отдавать предпочтение одному или другому при попытке сделать ограниченную копию строки?Почему?

Ответы [ 2 ]

5 голосов
/ 13 марта 2019

strncpy не является ограниченным strcpy. Это операция фиксированной длины (не ограниченной, фиксированной длины), нацеленная на назначение, которое является не строкой C (с нулевым символом в конце), а полем с нулевым заполнением , как то, что использовалось в определенных видах записи данных. таблицы в 70-х и начале 80-х годов. Он в основном не имеет современной цели и не должен использоваться, если вы действительно не хотите этого поведения.

snprintf - каноническая функция C для «ограниченного strcpy». В системах POSIX strnlen + memcpy будет еще одной хорошей альтернативой, и она необходима, если вам нужно поддерживать строки длиннее INT_MAX. Если у вас нет strnlen, вы можете легко сделать это с помощью memchr и сделать то же самое.

Обратите внимание, что простое использование snprintf не является «ограниченным» в том смысле, что оно ограничено тем, сколько он читает из источника; он обязательно читает всю исходную строку, чтобы определить возвращаемое значение, которое может потребовать затрат времени и зависит от того, является ли источник допустимой (прекращенной) строкой. Если вы хотите, чтобы он был ограничен в смысле как источника, так и назначения, вы можете сделать что-то вроде:

snprintf(dest, n, "%.*s", (int)n-1, src);

Однако, это достаточно не идиоматично и подвержено ошибкам, поэтому я бы просто использовал strnlen и memcpy вместо.

3 голосов
/ 13 марта 2019

Использование snprintf(dst, n "%s", src).

snprintf(dst, n "%s", src) гарантирует, что dst равен нулевой символ завершен.strncpy(dst, src, n) этого не делает.

strncpy(dst, src, n) всегда делает n копий, тогда как snprintf(dst, n "%s", src) делает min(strlen(src),n) копий

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