Вы должны использовать filename[3]='\0';
.Что касается того, почему это необходимо: потому что ничто другое не установило терминатор NUL для строки, поэтому вам нужно.
Редактировать: конечно, для реального использования вы не используете константу, как я показал выше,Как правило, вы бы использовали что-то вроде:
char *substring(char *out, char const *in, size_t len) {
memcpy(out, in, len);
out[len] = '\0';
return out;
}
Обратите внимание, что у вас действительно была правильная идея, используя memcpy
.strncpy
(для очевидного примера) - не действительно правильная вещь, которую следует использовать для этой (или почти любой другой) цели.В списке стандартных библиотечных функций, которых следует избегать, strncpy
стоит на втором месте в списке, уступая только gets
(хотя, честно говоря, я должен отметить, что strtok
является close третью).
Также обратите внимание, что (как и большинство стандартных библиотечных функций) здесь не делается попытка проверки передаваемых вами параметров - например, если вы скажете ему скопировать 99 символов из строки длиной всего 10 символов в буфердлина всего 5 символов, в любом случае он попытается скопировать 99 символов, что приведет к неопределенному поведению).
Edit2: одна альтернатива - использовать sprintf .