strncpy(ports[port].collect_digits[marker++], digit, sizeof(ports[port].collect_digits[marker]));
Это неверно.
Вы выделили на collect_digits определенный объем памяти.
Вы копируете цифры * в эту память.
Длина, которую вы должны скопировать, strlen (цифры). На самом деле вы копируете это sizeof (ports [port] .collect_digits [marker]), который даст вам длину одного символа *.
Вы не можете использовать sizeof (), чтобы найти длину выделенной памяти. Кроме того, если вы не знаете априори, что цифры имеют ту же длину, что и выделенная вами память, даже если sizeof () сообщит вам длину выделенной памяти, вы скопируете неправильное количество байтов (слишком много; вы только нужно скопировать длину цифры).
Кроме того, даже если две длины всегда одинаковы, получение длины таким способом не является выразительным; это вводит в заблуждение читателя.
Обратите внимание, что strncpy () будет дополняться завершающими значениями NULL, если указанная длина копии превышает длину исходной строки. Таким образом, если цифры равны длине выделенной памяти, у вас будет неразрывная строка.
Строка sprintf () функционально корректна, но для того, что вы делаете, strcpy () (в отличие от strncpy ()), насколько я вижу и знаю о коде, правильный выбор.
Я должен сказать, я не знаю, что вы пытаетесь сделать, но код кажется очень неловким.