Anzeige:
Ergebnis 1 bis 5 von 5

Thema: [C] vsprintf macht Fehler?

  1. #1
    Registrierter Benutzer
    Registriert seit
    29.09.2002
    Beiträge
    9

    [C] vsprintf macht Fehler?

    Hallo miteinander!

    Ich bin vorhin auf einen äußerst komischen Fehler gestoßen, der scheinbar vom vsprintf produziert wird...

    Ich bin grade dabei, IRC-Services zu schreiben, und beim Verbinden gibts immer wieder nette ASCII-Folgen zu sehen, die keinesfalls von der IRC-RFC her erlaubt sind.
    -16:34:27- «BL» Join» [develServ] (v)ÐA@under.construction)
    Der Nick "develServ" und der Host "under.construction" funktionieren, aber der Ident "v)ÐA" sollte "serv" sein. Der Realname - hier nicht zu sehen, sollte auch "Service under contruction" lauten, ist aber ebenso eine Kombination von ASCII-Zeichen, die nicht in meinem Code vorkommen.

    Über mehrere Stufen hab ich den Weg von der initialisierung bis zum verbinden verfolgt, und bis zu meiner Funktion snd() sind die Strings auch vollkommen in Ordnung...

    Code:
    #include <stdarg.h>
    typedef struct services_s {
       char *servicenick;
       char *servicehost;
       char *serviceuser;
       char *servicename;
    } services_t;
    
    /*
    serv->servicenick="develServ";
    serv->serviceuser="serv";
    serv->servicehost="under.construction";
    serv->servicename="Service under Construction";
    */
    
    void connect_service(services_t *serv) {
       //Hier sind alle Member von serv noch immer wie im obigen Kommentar
       snd("NICK %s 1 %d %s %s %s %d :%s" ,serv->servicenick,time(),serv->serviceuser,serv->servicehost,me->servername,time(),serv->servicename);
       snd("MODE %s +idqS",serv->servicenick);
    }
    
    void snd(char *fmt,...) {
       va_list argptr;
       char *snd=(char*)malloc(512);
    
       va_start(argptr,fmt);
       vsprintf(snd,fmt,argptr);
       //Hier scheinbar nicht mehr. serv->serviceuser und serv->servicename sind kryptische Zeichen
       va_end(argptr);
       [...]
       write(conn,snd,strlen(snd));
    }
    (Sollte mehr Code von Nöten sein, bitte Posten)

    Der snd()-Code funktioniert sonst auch einwandfrei, mit Ausnahme eines weiteren Falles, wo es sogar zu einem Segmentation Fault kommt.

    Code:
    typedef struct server_s {
       int link_numeric;
       char *servername;
       char *serverdesc;
    } server_t;
    
    int main (int argc, char *argv[]) {
       [...]
       server_t *me=(server_t*)malloc(sizeof(server_t));
       me->link_numeric=123;
       me->servername="dev.my.net";
       me->serverdesc="MyNet Services - under Development";
       [...]
       snd("SERVER %s 1 %s %d J10 H]] +s :%s",me->servername,me->servername,time(),me->serverdesc);
       [...]
    }
    Hier verabschiedet sich das Programm in der Funktion snd(), vermutlich auch beim vsprintf.

    Hat jemand schon Probleme wie meins gesehen, und/oder kennt eine Lösung? Ein Code-Schnipsel mit einem varargs-Beispiel wär auch nicht schlecht (varargs.h)

    Schon mal danke im Vorraus!

    Greetz, BhaaL

  2. #2
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Die Funktion time erwartet einen Parameter, und wenn es nur 0 ist.

    Und leg' nicht so viel Speicher mit malloc an, wenn es erstens nicht nötig ist, und zweitens, du ihn nie wieder freigibst, zb. reicht in der Funktion snd wenn statt malloc einfach ein Array anlegst.

  3. #3
    Registrierter Benutzer
    Registriert seit
    29.09.2002
    Beiträge
    9
    Zitat Zitat von wraith
    Die Funktion time erwartet einen Parameter, und wenn es nur 0 ist.
    Danke für den Hinweis, aber was hat das mit den kryptischen Zeichen zu tun, die scheinbar durch vsprintf entstehen?

    Zitat Zitat von wraith
    Und leg' nicht so viel Speicher mit malloc an, wenn es erstens nicht nötig ist, und zweitens, du ihn nie wieder freigibst, zb. reicht in der Funktion snd wenn statt malloc einfach ein Array anlegst.
    Da is überall ein free() drin, ich hab nur einiges weggekürzt
    My brain is running Linux.
    Nur WineX will nicht...

  4. #4
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Zitat Zitat von BhaaL
    Danke für den Hinweis, aber was hat das mit den kryptischen Zeichen zu tun, die scheinbar durch vsprintf entstehen?
    Probier' es einfach mal aus.
    Mit time(0) statt time() hat er bei mir keine kryptischen Zeichen mehr ausgegeben, und auch keine Seg-Faults mehr produziert.

  5. #5
    Registrierter Benutzer
    Registriert seit
    29.09.2002
    Beiträge
    9
    Zitat Zitat von wraith
    Probier' es einfach mal aus.
    Mit time(0) statt time() hat er bei mir keine kryptischen Zeichen mehr ausgegeben, und auch keine Seg-Faults mehr produziert.
    Hm, stimmt, hab eben kompiliert. Und siehe da, es geht.

    Besten Dank für die Hilfe!

    Greetz, BhaaL
    My brain is running Linux.
    Nur WineX will nicht...

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •