variable Paramterlisten



  • Also ich habe folgender Problem! Ich hab mal schnell ein kleines Programm geschrieben, was mir die oft mühsamen strcat Funktion ersparen soll. Es erstellt einfach durch Aufzählung der einzlnen Komponenten einen String, mit dem man später weiterarbeiten kann.
    So und nun mein Problem:
    Wie ihr unten seht rufe ich 2xmal die Funktion auf. Einmal mit vielen beliebigen Strings und einmal mit Variablen, die vorher definiert wurden.
    Beim ersten Aufruf macht er alles richtig, aber beim zweiten nimmt er nur 2 Argumente, WARUM?. er nimmt ja auch beim erstenmal alle stringe und nicht nur zwei.
    Naja wahrscheinlich ist die Lösung eh ganz simpel, aber im vorraus schon danke für mögliche Lösungen.

    Fabulous

    /*Dies ist ein Programm mit dem es möglich ist
    ohne lange mit strcat arbeiten zu müssen, mehrere
    Strings schnell und einfach miteinander verbinden
    kann*/
    
    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
    #include <stdarg.h>
    
    void connect(char[80],char[80],...);    //Prototyp der Funktion
    
    main()
    {
          char probe[80]={"Connect kann Strings"};
          char probe_2[80]={"verbinden"};
          char space[2]={" "};
    
          connect("DAS ","\n","IST ","EIN"," ","TEST ","_&_"); //hier wird die Funktion aufgerufen, mit _&_ wird das Ende gekennzeichnet
          printf("\n");
          connect(probe,space,probe_2,"_&_");            //hier nun ein Bsp mit Variablen die übergeben werden
          getch();
    }//end main
    
    /* Funktion zum Verbinden von Strings  *
     * Als letztes Argument wird immer _&_ erwartet */
    void connect(char a[80], char b[80], ...)
    {
        va_list params;
        char summe[200]={""},param[200]={""}; //Hilfevariablen werden gleich mit 0 initialisiert
        char *s;
    
        strcat(summe,a);
        strcat(summe,b);
        strcat(param,b);
        va_start(params,b);          //Das Makro va_start initialisiert params mit     der Adresse des ersten optionalen Arguments
                                     //Dazu muss als zweiter Parameter der letzte Pflichtparameter eingegeben werden      
    
        while(s!="_&_")
         {            
          s = va_arg(params,char*);  //hier wird param sukzessive jedes Wahlargument übergeben werden
                                     //der zweite Parameter ist der erwartete Datentyp
          if(s=="_&_")
           break;                    //hier wird abgebrochen wenn das Argument gleich _&_ ist
    
          strcat(summe,s);
         }
        va_end(params);              //Die Var param wird mit Hilfe von va_end zurückgesetzt
    
        printf("%s",summe);          //Der endgültige String wird ausgegeben
    }//end add
    

    <edit>Bitte Code-Tags verwenden</edit>


  • Mod

    schalt mal alle compilerwarnungen ein, dann wirst du es wissen



  • Was sofort auffällt - String-Litarale werden eigentlich nicht in {} eingeschlossen 😉 (also richtig: "char space[2]=" ";")



  • Also ich hab mich da jetzt noch gespielt und auch gesucht, aber ich find den Fehler nicht. Im Internet hab ich leider auch nix gefunden, aber danke für den Tipp mit der Stringdefinition, schaut echt besser aus.



  • Der Vergleich mit "&" vergleicht Adressen und keine Inhalte. strcmp verwenden.



  • Also irgendwie hat sich das Problem gelöst. Ich hab die ganze Zeit mit Dev-C++ programmiert, wo es bis jetzt nicht funktioniert. Aber in Borland C konnte ich mit der Einfügung von strcmp den Fehler beheben. Danke nochmal für die schnelle HIlfe.



  • Bitte denke daran, dass du s noch initialisieren musst. Bereits das Lesen eines unitialisierten Pointers führt zu undefiniertem Verhalten.


Anmelden zum Antworten