Du castest std::string::c_str() zu char*, aber c_str() liefert einen temporären Zeiger, der ungültig wird, sobald das std::string-Objekt zerstört wird. Wenn getString() ein temporäres Objekt ist, zeigt fmtstr ins Leere und strftime() bekommt Müll. Der Format Specifier %S ist nur ein Trigger, der die Länge verändert oder den Speicherzugriff verschiebt - und dadurch wird der Fehler sichtbar. Es ist nicht %S selbst, sondern der ungültige Zeiger. Ändere die Zeile
char *fmtstr = (char*)c->getParameter("str")->getString().c_str();zu
std::string fmtstr = c->getParameter("str")->getString();Und die Zeile
strftime(fmt, sizeof(fmt), fmtstr, timeInfo);
ändere zu
strftime(fmt, sizeof(fmt), fmtstr.c_str(), timeInfo);
Du kannst auch den Buffer vergrößern falls du einmal längere Ausgaben hast (z.B mit Name des Wochentag o.ä).