В чем преимущество strlmove против strmove в C?

Чтобы обрезать ведущие пробелы, мы используем strmove. Но нам посоветовали использовать strlmove вместо strmove. Я прочитал и использовал strlcpy и strlcat. Имеет ли strlmove аналогичную функциональность и каковы все его преимущества?

Редактировать 1: Спасибо, Майк Би и Крис Янг. Вот как мы используем strlcpy.

size_t strlcpy(char *dst, const char *src, size_t size)
{
    strncpy(dst, src, size - 1);
    dst[size - 1] = '\0';
    return(strlen(src));
}

Итак, я просто подумал об использовании strlmove () таким же образом. Я хочу подтвердить, определены ли какие-либо спецификации относительно реализации strlmove (). Я знаю, что это одно из лучших мест, о которых я могу спросить.

Изменить 2: strlmove () реализован так же, как strlcpy () и strlcat () с использованием memmove ().

size_t strlmove(char *dst, const char *src, size_t size)
{
    //Error if the size is 0
    //If src length is greater than size; 
    //   memmove(dst, src, size-1) and dst[size] = \0;
    //Otherwise
    //   memmove(dst, src, length(src));
    return source len;
}

Благодарим за предоставленную помощь и поддержку.

Спасибо, Мэтью Лиджу

Это единственное место, где Google находит ссылку на strlmove (); он знает больше о strmove ().

Jonathan Leffler 04.11.2008 10:25
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
2 278
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

strmove, strlmove, strlcpy, strlcat - все стандартные функции C нет, поэтому я не могу комментировать, что они делают, не зная, какую именно нестандартную библиотеку вы используете. Стандартный C предоставляет strcpy, strcat, strncat, strncpy, memmove, memcpy и т. д.

Имеет смысл использовать strncpy вместо strcpy для безопасности, если вы не знаете, что исходная строка поместится в целевой буфер. Однако у strncpy есть серьезная проблема с производительностью, заключающаяся в том, что всегда записывает количество байтов, указанное для размера. То есть:

char buf[4096];
strncpy(buf, "Hello", sizeof buf);

запишет 'H', 'e', ​​'l', 'l', 'o' и заполнит оставшиеся 4091 байт buf символом '\ 0'. Еще одна вещь, о которой следует помнить при использовании strncpy, заключается в том, что она не будет завершать строку нулем, если параметр размера меньше, чем длина исходной строки плюс ее null. Например:

char buf[5];
strncpy(buf, "Hello", sizeof buf);

запишет 'H', 'e', ​​'l', 'l', 'o' в buf и не будет завершаться нулевым символом в конце.

Ответ принят как подходящий

Как и Крис Янг упоминает, эти подпрограммы не являются стандартными (или, насколько мне известно, широко используются), поэтому я не могу быть на 100% уверен в большей конкретике, но:

Обычно варианты strl() подпрограмм str() принимают дополнительный параметр, который указывает размер целевого буфера. Подпрограмма гарантирует, что она не будет записывать данные за пределами буфера (поскольку она знает размер). Обычно функции strl() также гарантируют, что они поместят завершающий нулевой символ в конец строки или в конец буфера (потенциально усекая любую созданную там строку), так что вы также гарантированно получите завершающуюся строку, которая обычно будет ОК, чтобы перейти к другим функциям str(). Обратите внимание, что если длина буфера задана как 0 (ноль), функция нет поместит завершающий нулевой символ (поскольку в буфере нет места для чего-либо).

На мой взгляд, почти всегда лучше использовать функцию strl() (или strn()) вместо соответствующей процедуры str(), чтобы предотвратить переполнение буфера.

Быстрый поиск в Google показывает, что единственное упоминание о функции strlmove находится в stackoverflow :). Так что это, наверное, не очень распространенная функция. Но если мы предположим, что эта функция по своей природе близка к strlcpy, эта функция отличается от strmove использованием параметра размера для перемещения ограниченного количества байтов и сделать конечную строку NULL завершенной.

Да, Илья, это мог быть последний вариант для реализации.

Liju Mathew 04.11.2008 11:41

Есть одна большая разница между strncpy и strlcpy, по крайней мере, в версии Тео де Раадта, которую вы пропустили в своей реализации. Если длина данной строки меньше размера буфера, то strncpy заполняет остальную часть буфера нулевыми байтами. Во многих случаях это может быть лишь незначительной разницей, но поскольку многие программисты на c склонны использовать очень большие буферы, чтобы быть на безопасном сайте, это может иметь значение.


strncpy(buffer, "bla", 1024);

запишет в буфер 1021 '\ 0', хотя одного будет достаточно. strlcpy записывает только один '\ 0'.

Вау ... Хорошая находка. Мы упустили это в нашей реализации. Я поправил. Спасибо, что узнали об этом.

Liju Mathew 10.11.2008 07:19

Как сказал Крис, функции, которые вы используете в настоящее время, не являются стандартными. ... еще хуже то, что они по-прежнему крайне неэффективны и подвержены ошибкам. Вы могли бы легко создать пару API, которые используют memcpy / memmove и take (char *) s, которые будут работать везде и, вероятно, будут быстрее, чем не-std. варианты, которые вы используете в настоящее время.

Однако, если вы хотите, чтобы кто-то другой выполнял тяжелую работу и бесплатно получил безопасность / удобство использования, вы можете посмотреть что-то вроде устр ... который предназначен для простой интеграции, это std. C, безопасно, быстро и может работать с постоянными / автоматическими / utf8 / динамическими строками. Есть и другие варианты.

Другие вопросы по теме