Problem mit Unterprogrammen



  • lizzty schrieb:

    ja genau aber wie mach ich das? schreib ich kodieren(char text [81]) oder wie?:)

    Da wird's jetzt etwas eklig. Eigentlich gibt es keine Array-Funktionsparameter. In der Funktion kommt immer nur ein Zeiger auf das erste Element an, auch wenn du den Parameter als Array deklarierst. Auch eine Größenangabe ist wirkungslos. Der entscheidende Effekt ist, dass die Größeninformation, die ein Array in sich trägt, damit weg ist. Der Zeiger weiß nicht, wie groß das Array ist, auf das er zeigt.

    Das ist nicht weiter tragisch, man muss es nur wissen.

    Du kannst deine Funktionen also mit dem Parametertypen char* deklarieren. Aber wenn du irgendwo in den Funktionen die Arraygröße brauchst, musst du sie in einem separaten Parameter übergeben.



  • lizzty schrieb:

    ... schreib ich kodieren(char text [81]) oder wie?:)

    Also char text[81] bedeutet, das du ein Feld mit 81 Elementen vom Typ char hast.
    Diese Elemente sind durchnummeriert von 0 bis 80.

    Das erste Element wird angesprochen mit text[0]
    Das 20. Element mit text[19]
    Mit dem Namen text sprichst du das ganze Feld an.

    Das kodieren() den typ char braucht ist schon bei der Definition klar. Das brauchst du beim Aufruf der Funktion nicht mehr mitangeben.

    Da in deiner Funktion kodieren von strlen(text) die Rede ist meinst du:

    void kodieren(char text[]);
    

    Damit arbeitest du mit dem gesamten Feld.

    Zusatzinfo zu dem Post von MFK:

    void kodieren(char *text);
    

    bewirkt das gleiche wie mein Vorschlag.

    Die Längeninformation bei Strings wird in C durch das Nullzeichen ermittelt.
    Z.B.: strlen sucht solange bis ein Zeichen in dem Feld den Wert 0 hat.



  • Ihr habt wirklich super geholfen!!!
    Vielen vielen Dank!!!
    Es werden keine Fehler mehr angezeigt..jedoch bricht das Programm da ab, wo die Länge eines Arrays berechnet werden soll:

    char text[81];
    
    ..
    
    laenge = strlen(text);
    
    //auch schon ausprobiert:
    
    laenge = strlen((const char *)text);
    

    wo liegt bloss schon wieder der fehler?:(



  • Passiert denn bei den .. etws mit text?

    Oh Moment du machst

    scanf("%s",&text);
    

    Da text schon als Zeiger funktioniert ist das & zuviel.

    Mach mal

    char text[81] = "";
    int laenge;
    
    ..
      scanf("%s",text)
    ..
    
    laenge = strlen(text);
    

    In diesem Fall war in text kein 0 Zeichen und strlen hat sich dumm und dusselig gesucht. 😃

    (Bei scanf( "%d",&schieben); ist das & aber richtig)



  • Es wird aber nur bis zum ersten Leerzeichen gezählt..

    zb bei "Ich lerne C !" gibt er 3 aus..

    kann man das ändern?



  • Ja.



  • entschuldigung..

    könnte mri eventuell jemand sagen wie man es ändern kann?

    Vielen dank:)



  • Es gibt mehrere Varianten, mit Standardbibliotheksfunktionen Leerzeichen mit einzulesen:
    z.B.

    if( 1==scanf("%80[^\n]",text) )
    {
      printf("\n==%s==",text);
    }
    

    oder

    if( fgets(text,81,stdin) )
    {
      if( strchr(text,'\n') ) *strchr(text,'\n')=0;
      printf("\n==%s==",text);
    }
    

    oder
    ...
    wobei in beiden Beispielen zu beachten ist, dass der Ergebnisstring kein '\n' enthält, was meist auch nicht gewollt, leider oftmals aber diese Sonderbehandlung vergessen wird.



  • sie werden immer noch nicht mitgelesen..es werden eher teile abgeschnitten..



  • Am besten zeigst du nochmal, wie dein Programm jetzt aussieht.
    Ohne .. , denn da können ja auch die Fehler sein.

    Oder probier ein Miniprogramm.

    #include <stdio.h>
    #include <string.h>
    
    int main(void)
    {
      char text[81] = "";
    
      if( fgets(text,81,stdin) )
      {
        if( strchr(text,'\n') )
           *strchr(text,'\n')=0;
        printf("\n==%s==",text);
      }
    
      printf("\nLänge von <%s> = %lu\n", text, strlen(text));
      return 0;
    }
    

Anmelden zum Antworten