Функция strncpy работает не правильно.
- Войдите на сайт для отправки комментариев
Пнд, 16/11/2015 - 15:35
Описание функции:
Описание функции:
char * strncpy( char * destptr, const char * srcptr, size_t num );
Функция копирует первые num символов из строки srcptr в строку destptr.
1. Если конец строки srcptr (символ конца строки) достигнут прежде, чем были скопированы num символов, к скопированным символам в конец строки destptr добавляется нуль-символ, после чего, строка считается скопированной.
2. Если же строка назначения окажется меньше num, тогда скопируются символы, которые поместятся в destptr, учитывая то, что в конце строки обязательно должен стоять символ конца строки.
(Взял отсюда http://cppstudio.com/post/690/)
Код для теста:
void setup()
{
Serial.begin(9600);
byte numbCopyCharac = 1;
char str[6] = "12345";
char resultStr[3] = "89";
strncpy(resultStr, str, numbCopyCharac);
Serial.print("resultStr=["); Serial.print(resultStr); Serial.println("]");
}
Примеры работы программы:
numbCopyCharac = 1; Результат: resultStr=[19] Ожидается: resultStr=[1]
numbCopyCharac = 4; Результат: resultStr=[1234д] Ожидается: resultStr=[12]
numbCopyCharac = 5; Результат: resultStr=[12345] Ожидается: resultStr=[12]
numbCopyCharac = 6; Результат: resultStr=[12345] Ожидается: resultStr=[12]
numbCopyCharac = 7; Результат: re Ожидается: resultStr=[12]
numbCopyCharac = >7; Результат: r ЋйrЋйrЋйr.йrЋйr.ЙrЋйrЋЙrЋйrЋйrЋйrЋйrЋйrЋйrЋ……
В итоге получается, что strncpy не потдерживает 1 и 2 условия из описания.
Где можно посмотреть реальное описание функций для Arduino IDE?
strncpy не потдерживает 1 и 2 условия из описания.
У всех работает, а у Вас нет. Значит неправильно понимаете.
Во первых результирующий буфер должен быть не меньше исходного.
Во вторых, согласно п.2 если при копировании символ окончания строки не найден, нужно его записать вручную.
Как правило копировать лучше так:
strncpy(res, str, num);
res[num] = '\0';
Разумеется res должен иметь длину num+1, не меньше.
Описание библиотеки AVR - http://www.nongnu.org/avr-libc/user-manual/modules.html
То, чем Вы пользовались - какой-то дебильный перевод, призванный запудрить мозги. На самом деле эта функция в Arduino работает точно также, как и везде - совершенно нормально и предсказуемо: если исходная строка короче num - копируется с нулём, если длинее - нуль не копируется. Принимающий буфер никто и никак не контролирует (хватит там места для num символов или не хватит - это на совести программитса), так что "распахать память" - как два пальца .... Вот собственно и всё описание.
kisoft, ТС смутило выражение "Если же строка назначения окажется меньше ...". Что под этим понимал переводчик - хрен его знает, но я бы понял "принимающий буфер", что есть полный маразм. В общем, с таким переводом - лучше не надо.
Я перевод даже читать не стал, дебилов хватает. Привёл пример как мы используем эту функцию.
Спасибо за разъяснение и за ссылку ребят, то что надо.