[C/C++] Länge der Übergebenen Parameter herrausfinden/überprüfen

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von thecoolman4rr, 13. Oktober 2006 .

Schlagworte:
  1. 13. Oktober 2006
    Länge der Übergebenen Parameter herrausfinden/überprüfen

    Moinsens...
    ich hab mal wieder ein problem =))
    Ich hab eine Logfileclass geschrieben... soweit sogut. Allerdings ist mir dann aufgefallen das man recht schnell einen array überladen kann.
    Das ganz funktioniert im Prinzip so, dass ich an eine Funktion einen formatierten Text übergebe und die Funktion ihn dann in einen einzigen String(Array) verwandelt. Das Problem ist allerdings, dass die Länge des übergebenen Textes beliebig seien kann, die Groeße des Strings aber natürlich nicht, was dem entsprechend schnell zu einem Absturz führen kann.
    Code:
    #define MAX_BUFFER 1024
    
    void fTextout(const char *Text, ...)
    {
     TCHAR buffer[MAX_BUFFER]; // hier wird der Array erstellt. Er kann laut obigem define 1023 Zeichen fassen
     va_list pArgList;
     va_start(pArgList, Text);
     vsprintf (buffer, Text, pArgList); // hier ist nun der Knackpunkt, da die übergebenen Zeichen länger als 1024 Zeichen lang seien können
     va_end(pArgList);
     
     Textout (buffer); // Textout ist dann eine einfach Funktion die den übergebenen Text einem htmllogfile hinzufügt
    }
    
    int main(void)
    {
     int Zahl = 9;
     fTextout("Hallo das ist die Zahl %i", Zahl); // schwachsinnig aber egal...
     return 0;
    }
    
    Der Codeausschnitt gehört noch zu einer gesamten Klasse. Der Codeausschnitt kommt zum Teil/ in ähnlicher Art in einem Buch vor. Allerdings wird dort die funktionsweise von "va_list" usw nicht erklärt sondern so hingenommen! Ich habe gestern schon den halben Abend damit verbracht Infos über dieses va_list, va_start und va_end zu bekommen, leider mehr oder weniger erfolglos. Ich weiß nur das va_list einen Pointer erstellt (also das pArgList) ein Pointer ist. Auf was er allerdings zeigt ist mir bis jetzt verschwiegen geblieben und auch durch mehrmaliges versuchen konnte ich nicht auf den Inhalt des Pointers kommen.
    Ich hoffe ihr könnt mir irgentwie helfen

    mfg thecoolman4rr

    *+~edit~+*
    falls es nützlich ist... ich hab schon einen kleinen Workaround geschrieben, allerdings hat man damit das Problem, dass für das "%i" nicht der integer-Wert eingesetzt wird sondern weiterhin einfach nur "%i" da steht.
    Code:
    void fTextout(const char *Text, ...)
    {
     char Buffer[MAX_BUFFER];
     int counter = 0;
     for(int i = 0; i < MAX_BUFFER; i++)
     {
     const char *plol = Text + i;
     if(*plol == 0x00)
     {
     Buffer[i] = 0x00;
     break;
     }
     else
     {
     Buffer[i] = *plol;
     counter++;
     }
     }
     cout << "Buffer: " << Buffer << endl << "Counter: " << counter << endl;
     Textout(Buffer);
    }
    
     
  2. 13. Oktober 2006
    AW: Länge der Übergebenen Parameter herrausfinden/überprüfen

    Hi,
    erstmal wieso beschränkst du dich auf 1024 zeichen? Hat's ein Grund?
    Dann such doch nach der null was du auch machst (siehe deine for-Schleife) und zähle die Zeichen dann erzeug denn benötigten Array mit der gefundenen Größe ( Buffer[counter]). Somit bleibst du auch flexibel was die Größe des Strings angeht.

    ...

    Ach so und was heist (void fTextout(const char *Text, ...)) ...?
     
  3. 13. Oktober 2006
    AW: Länge der Übergebenen Parameter herrausfinden/überprüfen

    die 1024 Zeichen haben den Grund der Speicherreservierung =)(also zuviel = große Speicherauslastung... will ja nicht den ganzen Speicher mit dem dummen Buffer voll hauen. Ich will mich auch nicht darauf verlassen das nie das ganze größer wird als die angegebene Zahl! Einfach nur irgentwie ne überprüfung und ferdisch )

    mfg thecoolman4rr

    *+~edit~+*

    ok JETZT bin ich verwirrt Seit wann kann man die Größe von Arrays während des Programmaufrufes verändern? Das ist ja voll krank nee ernsthaft das geht doch sonst nicht (Bsp.: cin >> Groesse; char Bumm[Groesse] das gibt bei der Eingabe sofort ne Fehlermeldung !? wieso geht das nicht aber das unten gezeigte geht??
    Code:
    #include <cstdlib>
    #include <iostream>
    #include <stdio.h>
    #include <windows.h>
    
    using namespace std;
    
    void fTextout(const char *Text, ...);
    
    int main(int argc, char *argv[])
    {
     char Eingabe[50];
     cin.get (Eingabe, 49);
     int Zahl = 9;
     fTextout(Eingabe, Zahl);
     system("PAUSE");
     return EXIT_SUCCESS;
    }
    
    void fTextout(const char *Text, ...)
    {
     int counter;
     for(int i = 0; i < 25; i++)
     {
     const char *plol = Text + i;
     if(*plol == 0x00)
     {
     counter++;
     break;
     }
     else
     {
     counter++;
     }
     }
     char Buffer[counter];
     va_list pArgList;
     va_start(pArgList, Text);
     vsprintf(Buffer, Text, pArgList);
     va_end(pArgList);
     cout << "\nBuffer: " << Buffer << endl << "Counter: " << counter << endl;
    }
    
    naja egal Hauptsache es geht... verwirrend ist es trotzdem...

    Wenn jemand noch nen schlauen Satz dazu hat: Bitte melden ;-)
     
  4. 13. Oktober 2006
    AW: Länge der Übergebenen Parameter herrausfinden/überprüfen

    Ja warte mal du erzeugst ja deinen char buffer[MAX_..] in der Funktion also wird der speicher erst nach dem Aufruf reserviert. Das heißt du kannst denn auch nach der for-Schleife erzeugen oder wann immer es dir danach ist. Was passieren kann du hast keinen Speicher zur Verfügung, was bei heutigen Standart Rechnern (512 MB RAM) kaum auftretten wird bei paar Kilobyte. Es sei denn du lässt noch tausend weitere Programme nebenher laufen.
    Sollte es kritisch mit dem Speicher sein muss du dir einen Speicher Bereich reservieren. In deinem Code tust du es nicht. Also einfach for-Schleife dann char buffer[counter] und dann der Rest.
    Vielleicht irre ich mich, aber kann ich mir kaum vorstellen.
     
  5. 13. Oktober 2006
    AW: Länge der Übergebenen Parameter herrausfinden/überprüfen

    Hi,

    warum ueberpruefst du nicht einfach die Uebergeben Stringlaenge mit strlen?
    Oder benutzt strncpy oder snprintf ?

    Oder hab ich jetzt die Frage ganz falsch verstanden ?

    Mfg,

    Kolazomai
     
  6. 13. Oktober 2006
    AW: Länge der Übergebenen Parameter herrausfinden/überprüfen

    Der übergibt doch nur einen Pointer auf das String nicht den gesammten String.

    Aber wenn er die Länge vor der Übergabe überprüfen würde (siehe Vorschlag vorher) und dann die Länge mitübergeben, wäre die for-Schleife nicht nötig.
     
  7. 13. Oktober 2006
    AW: Länge der Übergebenen Parameter herrausfinden/überprüfen

    Oehm ...

    Code:
    #include <stdio.h>
    
    void funktion(char *whatever)
    {
    char in_funk[1024];
    snprintf(in_funk,1024 - 1,
     "%s",whatever);
    printf("%s\n",in_funk);
    }
    
    int main()
    {
    char *x = "Hello World\n";
    funktion(x);
    return 0;
    }
    Ich versteh irgendwie das Problem nicht so ganz ^^

    Mfg,

    Kolazomai
     
  8. 13. Oktober 2006
    AW: Länge der Übergebenen Parameter herrausfinden/überprüfen

    vor der übergabe wäre aber ziemlich umständlich Weil ich dann ja jedesmal den Wert auch noch mit übergeben müsste o.0
    Aber so wie ichs jetzt daunten gemacht hat gehts ja zum Glück. Ich hatte da "nur" was mit den Arrays falsch verstanden =)) Aber so funktioniert jetzt alles wunderbar und die Klasse macht schöne farbnfrohe, formatierte Logfiles =)

    mfg thecoolman4rr


    *+~edit~+*

    ich seh grad Kolazomais ist aber unformatiert, sprich man kann nicht so ne schönen Sachen machen wie ("Hallo das ist Zahl %i", Zahl); , oder?

    *+~edit2~+*

    ich hab euch beiden ma schöne 6 points gegeben ;-)
     
  9. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.