Функция strncpy работает не правильно.

Seriga
Offline
Зарегистрирован: 01.06.2015

Описание функции:

Описание функции:
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 условия из описания.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

У всех работает, а у Вас нет. Значит неправильно понимаете.
Во первых результирующий буфер должен быть не меньше исходного.
Во вторых, согласно п.2 если при копировании символ окончания строки не найден, нужно его записать вручную.
Как правило копировать лучше так:
strncpy(res, str, num);
res[num] = '\0';
Разумеется res должен иметь длину num+1, не меньше.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Описание библиотеки AVR - http://www.nongnu.org/avr-libc/user-manual/modules.html

То, чем Вы пользовались - какой-то дебильный перевод, призванный запудрить мозги. На самом деле эта функция в Arduino работает точно также, как и везде - совершенно нормально и предсказуемо: если исходная строка короче num - копируется с нулём, если длинее - нуль не копируется. Принимающий буфер никто и никак не контролирует (хватит там места для num символов или не хватит - это на совести программитса), так что "распахать память" - как два пальца .... Вот собственно и всё описание.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

kisoft, ТС смутило выражение "Если же строка назначения окажется меньше ...". Что под этим понимал переводчик - хрен его знает, но я бы понял "принимающий буфер", что есть полный маразм. В общем, с таким переводом - лучше не надо.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Я перевод даже читать не стал, дебилов хватает. Привёл пример как мы используем эту функцию.

Seriga
Offline
Зарегистрирован: 01.06.2015

Спасибо за разъяснение и за ссылку ребят, то что надо.