Wie übergebe ich ein char einem string?



  • Habe folgendes Problem. Wie kann ich ein char einer Funktion übergeben die aber auch stings übernehmen kann?

    Bzw, weiss ich das ein String am Ende '\0' hat, da ich aber ein char übergebe fehlt dieser Endbezeichner.

    Der Fehler kommt eben schon daher da ein Abbruch bei strlen(str) entsteht, vielleicht eben wegen dem fehlenden '\n' Endbezeichner...

    Wie kann ich dies durch eine Funktion besser lösen?

    #include <stdio.h>
    #include <string.h>
    
    void test( str[] ) {
    
       if( strlen(str) == 1 ) 
          printf("%c", str[0]);
       else if( strlen(str) > 1 )
          printf("%s", str);
    
    }
    
    int main(void) {
    
       char c   = 'c';
       char s[] = "string";
    
       test(s);
       test(&c);  // ohne Adressoperator '&' kommt eine Fehlermeldung
    
       getchar();
    
       return 0;
    
    }
    


  • So könnte man es machen:

    #include <stdio.h>
    #include <string.h>
    
    char *make_string(char c, char buf[2]) {
      buf[0] = c;
      buf[1] = 0;
    
      return buf;
    }
    
    void test( char str[] ) { /* Typ nicht vergessen, sonst ist str implizit int[] */
    
       if( strlen(str) == 1 )
          printf("%c", str[0]);
       else
          printf("%s", str);
    
    }
    
    int main(void) {
       char c   = 'c';
       char s[] = "string";
       char buf[2];
    
       test(s);
       test(make_string(c, buf));
    
       getchar();
    
       return 0;
    }
    


  • Klar, ganz übersehn (char str[])

    Danke für dein Lösungsvorschlag. Habe mir auch schon überlegt zusätzlich zu Indikator mit zugeben ob String oder ein Char übergeben wird.

    Gibt es keine elegantere Lösung? Nicht das deine gut wäre...



  • Die elegantere Lösung wäre, zwei verschiedene Funktionen zu bauen.



  • morszeck schrieb:

    Gibt es keine elegantere Lösung? Nicht das deine gut wäre...

    char und char* sind unterschiedliche Typen. Und eine Variable kann nur einen Typen haben - folglich geht es nicht.

    Der Workaround ist, aus dem char einen char* zu machen.

    Ich würde es uU so machen:
    den char als Zeiger übergeben und zusätzlich eine Längenangabe.



  • Habe doch noch eine Lösung entdeckt, mit einer Hilfsvariabel gehts...

    #include <stdio.h>
    #include <string.h>
    
    void test( char str[] ) {
    
       char help[250];
    
       strcpy( help, str ); // hier wird automatisch \0 angehängt ...
    
       if( strlen(help) == 1 )
          printf("%c", help[0] );
       else if( strlen(help) > 1 )
          printf("%s", help );
    
    }
    
    int main(void) {
    
       char c   = 'c';
       char s[] = "string";
    
       test(s);
       test(&c);  // ohne Adressoperator '&' kommt eine Fehlermeldung
    
       getchar();
    
       return 0;
    
    }
    


  • morszeck schrieb:

    Habe doch noch eine Lösung entdeckt, mit einer Hilfsvariabel gehts...

    test(&c);  // ohne Adressoperator '&' kommt eine Fehlermeldung
    

    Natürlich kommt eine Fehlermeldung, weil die Typen anders sind, test erwarett ein char[] und ohne & übergibst ein char! Aber das ist koplett Kässe und führt irgendwann zu einer "Segmentation fault", weil test ein 0-terminierendes String erwartet und &c keinesfalls ein 0-Terminierendes String. Also sowas nie machen! Passt doch besser auf, was ihr für Variablen übergibt, vor allem bei Zeichenketten. Vor allem hier (in test)

    strcpy( help, str ); // hier wird automatisch \0 angehängt ...
    

    das nenne ich Write-And-Pray. Es wundert mich, dass da kein Abstürtzt gibt bzw. dass dein String nicht Müll enthält.

    Und am besten wäre

    #include <stdio.h> 
    #include <string.h> 
    
    void test( char str[] ) { 
    
       //strcpy( help, str ); // hier wird automatisch \0 angehängt ... 
       // unnötig, strcpy verlangt 0-terminierende strings
    
       if( strlen(str) == 1 ) 
          printf("%c", str[0] ); 
       else if( strlen(str) > 1 ) 
          printf("%s", str ); 
    
    }
    
    int main(void) { 
    
       char c   = 'c'; 
       char s[] = "string";
       char str_c[2];
    
       test(s); 
       str_c[0]=c;str_c[1]=0;
       test(str_s);
    
       return 0; 
    
    }
    

    (Schau doch beefy's Lösung)

    Aber ich verstehe nicht, wozu du die Funktion test machst. Was ist denn der Sinn der Sache, wenn du printf sowieso benutzt?



  • Da ich argv[] auswerte und je nach dem auch falsche Eingaben erfolgen könnten, so will ich die falsche Eingabe der Funktion übergeben, oder fals noch gewisse Bedingungen unklar sind, so will ich auch nur eine Fehlermeldung der Funktion übergeben können.

    Poste nachher mal meine komplette Lösung. Ist eben für eine Transcompiler...



  • morszeck schrieb:

    Da ich argv[] auswerte und je nach dem auch falsche Eingaben erfolgen könnten, so will ich die falsche Eingabe der Funktion übergeben, oder fals noch gewisse Bedingungen unklar sind, so will ich auch nur eine Fehlermeldung der Funktion übergeben können.

    Poste nachher mal meine komplette Lösung. Ist eben für eine Transcompiler...

    Ich verstehe nicht, was du machen willst.



  • Dies sagt mir die Hilfe zu argv !:

    argv is an array of pointers to strings (char *[]).

    - argv[0] is the full path name of the program being run.
    - argv[1] points to the first string typed on the operating system command line after the program name.
    - argv[2] points to the second string typed after the program name.
    - argv[argc-1] points to the last argument passed to main.
    - argv[argc] contains NULL.

    @ morszeck:
    Was willst du denn genau nun tun ? 😋



  • Du schreibst dir einfach zwei Funktionen. Für jeden Fall eine, und nennst beide gleich. Der Kompiler nimmt dann jeweils die richtige Funktion.



  • Hallo,

    Horst2 schrieb:

    und nennst beide gleich

    nein, besser nicht, denn in ANSI-C kann man Funktionen nicht überladen.

    😉

    MfG


Anmelden zum Antworten