В
const char *s="string";
printf(s,"Didnt Work %s");
Первый аргумент "строка" интерпретируется как строка формата. У него нет кодов вставки, поэтому второй параметр никогда не будет использоваться. Результатом будет «строка».
Ото
printf("Didnt Work %s",s);
Существует код вставки, поэтому второй аргумент вставляется в виде строки, в результате получается «Не работает строка».
Это не перегрузка, потому что, хотя возможны разные типы аргументов, как и при перегрузке, с переменными аргументами всегда вызывается одна и та же функция. При перегрузке вызываются разные функции в зависимости от типа аргумента.