Mach die j = i + 1 Optimierung raus und lass die Schleife auch bei 0 starten, dann klappt's wie gewünscht.
Die sorgt nämlich - was falsch ist - dafür, dass bei späteren Zahlen die vorherigen nicht mehr geprüft werden.
(Natürlich muss im if dann auch noch eine i != j Bedingung stehen, damit die Zahl sich nicht selbst als Duplikat findet)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
size_t copy_duplicates(int dst[], const int src[], size_t len) {
size_t n = 0;
for(size_t i = 0; i < len; i++) {
int is_duplicate = 0;
for (size_t j = 0; j < len; j++) {
if(src[i] == src[j] && i != j) {
is_duplicate = 1;
break;
}
}
if (is_duplicate) {
dst[n] = src[i];
n++;
}
}
return n;
}
int main (void) {
int src[] = {5, 3, 5, 4, 4, 5};
int len = 6;
int dst[6];
size_t num_duplicates = copy_duplicates(dst, src, len);
printf("%zu\n", num_duplicates);
for (size_t i = 0; i < num_duplicates; i++) {
printf("%d ", dst[i]);
}
return EXIT_SUCCESS;
}