lima-city: Webhosting, Domains und Cloud
0 Pluspunkte 0 Minuspunkte

Ich habe diese Funktion in C++

void scSystemTimeF(JObject *c, void *) {       
    char *fmtstr = (char*)c->getParameter("str")->getString().c_str();
    time_t currentTime = time(NULL);
    struct tm* timeInfo = localtime(&currentTime); 
    char fmt[50]; 
    strftime(fmt, sizeof(fmt), fmtstr, timeInfo);
    c->getReturnVar()->setString(fmt); 
}

Wenn ich als Formatstring das angebe

"%d.%m.%y %H:%M"

kommt das richtige Ergebnis

"05 10 2025 15 54"

Wenn ich aber auch die Sekunden auch angeben will

"%d.%m.%y %H:%M:%S"

kommt als Ausgabe plötzlich

"/etc/localtime"

Wtf wie kommt das und wie fixe ich das?

von  

1 Antwort

0 Pluspunkte 0 Minuspunkte

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.ä).

von (757 Punkte)  
Diese Community basiert auf dem Prinzip der Selbstregulierung. Beiträge werden von Nutzern erstellt, bewertet und verbessert – ganz ohne zentrale Moderation.

Wer hilfreiche Fragen stellt oder gute Antworten gibt, sammelt Punkte. Mit steigender Punktzahl erhalten Mitglieder automatisch mehr Rechte, zum Beispiel

  • Kommentare verfassen
  • Fragen und Antworten bewerten
  • Themen von Fragen bearbeiten
  • Fragen, Antworten und Kommentare bearbeiten
  • Inhalte ausblenden

So entsteht eine Plattform, auf der sich Qualität durchsetzt – getragen von einer engagierten Gemeinschaft.

2.5k Fragen

2.9k Antworten

278 Kommentare

13 Nutzer