Этот вызов
memmove(dst,src+1,strlen(src+1)-1);
не создает строку в массиве символов, на которую указывает указатель dst, поскольку конечный ноль не копируется и целевой массив не может быть инициализирован нулями.
Также выражение strlen( src + 1 ) - 1
может вызывать неопределенное поведение.
И нет смысла использовать memmove при условии, что символьные массивы не перекрываются.
Вот демонстрационная программа, которая показывает как задача может быть выполнена.
#include <stdio.h>
#include <string.h>
char * remove_char( char * restrict dst, const char * restrict src )
{
size_t n = strlen( src );
n = n < 2 ? 0 : n - 2;
if ( n != 0 )
{
memcpy( dst, src + 1, n );
}
dst[n] = '\0';
return dst;
}
int main(void)
{
enum { N = 10 };
char dst[N];
printf( "\"%s\"\n", remove_char( dst, "" ) );
printf( "\"%s\"\n", remove_char( dst, "1" ) );
printf( "\"%s\"\n", remove_char( dst, "12" ) );
printf( "\"%s\"\n", remove_char( dst, "121" ) );
return 0;
}
Вывод программы:
""
""
""
"2"