Чтобы обрезать ведущие пробелы, мы используем 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;
}
Благодарим за предоставленную помощь и поддержку.
Спасибо, Мэтью Лиджу





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 завершенной.
Да, Илья, это мог быть последний вариант для реализации.
Есть одна большая разница между strncpy и strlcpy, по крайней мере, в версии Тео де Раадта, которую вы пропустили в своей реализации. Если длина данной строки меньше размера буфера, то strncpy заполняет остальную часть буфера нулевыми байтами. Во многих случаях это может быть лишь незначительной разницей, но поскольку многие программисты на c склонны использовать очень большие буферы, чтобы быть на безопасном сайте, это может иметь значение.
strncpy(buffer, "bla", 1024);
запишет в буфер 1021 '\ 0', хотя одного будет достаточно. strlcpy записывает только один '\ 0'.
Вау ... Хорошая находка. Мы упустили это в нашей реализации. Я поправил. Спасибо, что узнали об этом.
Как сказал Крис, функции, которые вы используете в настоящее время, не являются стандартными. ... еще хуже то, что они по-прежнему крайне неэффективны и подвержены ошибкам. Вы могли бы легко создать пару API, которые используют memcpy / memmove и take (char *) s, которые будут работать везде и, вероятно, будут быстрее, чем не-std. варианты, которые вы используете в настоящее время.
Однако, если вы хотите, чтобы кто-то другой выполнял тяжелую работу и бесплатно получил безопасность / удобство использования, вы можете посмотреть что-то вроде устр ... который предназначен для простой интеграции, это std. C, безопасно, быстро и может работать с постоянными / автоматическими / utf8 / динамическими строками. Есть и другие варианты.
Это единственное место, где Google находит ссылку на strlmove (); он знает больше о strmove ().