sprintf -> immer written-Error (Programmabsturz)



  • Hallo!

    Warum stürzt mein Programm immer bei sprintf ab? Ich brauche die Zeitinfos, um sie später in einem fstream zuspeichern.

    Viele Grüße
    pmw

    #include <iostream>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
       unsigned int ms,sec,m,h;
       char *SText;
    
       ms = GetTickCount();
       sec = ms / 1000;
       ms = ms % 1000;
       m = sec / 60;
       sec = sec % 60;
       h = m / 60;
       m = m % 60;
    
       cout << "{" << h << ":" << m << ":" << sec << ":" << ms << "}";
       cout << "{written-Error jetzt}";
       sprintf(SText,"Benoetigte Zeit: %02dh : %02dm : %02ds : %02dms", h, m, sec, ms);
       cout << SText; 
    
       system("PAUSE");
       return 0;
    }
    


  • Du übergistb an sprintf zwar einen Zeiger auf char, aber worauf zeigt der denn?
    Auf irgendeinen undefinierten Wert...

    Entweder machst du das über dynamische Speicherzuteilung:

    char *cText = new char[1024];
    
    //[...]
    
    delete[] cText;
    

    oder, wenn es wirklich nur das kleine Prog ist über:

    char cText[1024];
    
    //[...]
    


  • Ich weiß aber leider nicht wie groß SText wird. Ich würde ja gerne Strings nehmen, aber damit kann sprintf leider nicht umgehen.

    Gibt es vielleicht eine "richtige" C++ Funktion für sprintf?



  • Dann nimm einen std::stringstream.

    #include <sstream>
    
    ...
    
    std::ostringstream stream;
    stream << "Hier einfach reinschreiben wie in cout" << std::endl;
    std::string fertigerString = stream.str();
    


  • Kann es schon... bzw. kann CString auch mit sprintf umgehen.
    Aber normalerweise benutzt man dazu dann CString::FormatMessage() & Co.

    Wenn du es über sprintf machen willst, kannst du das machen, indem du direkt auf den Buffer des Strings mit CString::GetBuffer(size) zugreifst.

    Willst du kein Bit an Speicher zuviel nutzen (das war vielleicht ein Grund vor 20 Jahren, heute aber wohl kaum noch), dann könntest du auch erst die benötigte Buffergröße berechnen:

    int iSize = (int)strlen("Benoetigte Zeit: 12h : 12m : 12s : 12ms") + 1;

    Das gäbe dann iSize = 40;

    danach dann mit
    char *pString = new char[40]; den Speicher reservieren und hinterher wieder mit
    delete[] pString; freigeben (bzw. anstelle 40 iSize).

    Das wäre aber die ungewöhnlichste Lösung, die ich mir vorstellen kann. 😉

    Leg doch einfach am Anfang 100 Byte an (oder 1kb). Das stört doch keinen...



  • Das ganze ist für die Schule, dann da ist es halt wichtig, dass keine Zeile Code zuviel da ist und es darf kein Bit zuviel Speicher genutzt werden. Außerdem muss ich natüprlich jede Zeile erklären können.

    [EDIT]Ich glaube, ich nutze dann doch besser das alte fprintf. Sieht nur ein wenig Merkwürdig aus. Ich arbeite 5x mit fstream und 1x mit FILE*.[/EDIT]


Anmelden zum Antworten