1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Unsere jährliche Weihnachts-Banner-Aktion hat begonnen! Wir freuen uns auf viele, viele kreative Vorschläge.
    Mehr dazu könnt Ihr hier nachlesen: Weihnachtsbanner 2016

    Information ausblenden

C Programm (Buchstaben zählen)

Dieses Thema im Forum "Café" wurde erstellt von fufL, 27.05.09.

  1. fufL

    fufL Friedberger Bohnapfel

    Dabei seit:
    14.05.08
    Beiträge:
    538
    Hallo zsamm!

    Hab ein Problem. Und zwar sollen wir in der Uni ein Programm schreiben, bei dem man eine Zeichenkette eingibt und dann einen Buchstaben oder eine Zahl die in der Kette gesucht und gezählt wird. Danach soll das Ergebnis ausgegeben werden.

    Soweit so gut. Ich hab das ganze jetzt mal ohne eine Funktion geschrieben und da kommt folgendes raus:
    Code:
    #define _CRT_SECURE_NO_DEPRECATE
    #include <stdio.h>
    int count_char(char *str, char zeichen);
    int main(void)
    {
        
        int i = 0, z = 0;
        char kette[100];
        char zeichen[2];
        printf("Bitte Zeichenkette (max. 99) eingeben: ");
        scanf("%99s", kette);
        printf("Zu suchendes Zeichen: ");
        scanf("%1s", zeichen);
    
    
        for(i = 0; i < 100; ++i)
            if(kette[i]==zeichen[0])
                z++;
        printf("Gesuchtes Zeichen -%s- kam %d mal vor.\n", zeichen, z);
        return 0;
    }
    Und das funktioniert auch und tut es einwandfrei!

    Jetzt will der Prof aber eine Funktion haben der die Zeichenkette und das zu suchende Zeichen übergeben wird und dann die ermittelte Anzahl zurückgibt ins main Programm. Er hat die Funktion int count_char(char *str, char zeichen); gennant. Was hat es denn mit dem * auf sich? Ist das nötig?

    Denn mein Programm schaut jetzt so aus:
    Code:
    #define _CRT_SECURE_NO_DEPRECATE
    #include <stdio.h>
    int count_char(char kette, char zeichen);
    int main(void)
    {
    
        char kette[100];
        char zeichen[2];
        printf("Bitte Zeichenkette (max. 99) eingeben: ");
        scanf("%99s", kette);
        printf("Zu suchendes Zeichen: ");
        scanf("%1s", zeichen);
        printf("Gesuchtes Zeichen -%s- kam %d mal vor.\n", zeichen, count_char(kette[100], zeichen[2]));
        return 0;
    }
    
    int count_char(char kette, char zeichen)
    {
        int i, z = 0;
        for(i = 0; i < 100; ++i)
            [COLOR=Red][B]if(kette[i]==zeichen[0])[/B][/COLOR]
                z++;    
        return z;
    }
    Aber er gibt mir jetzt einen Fehler in der Markierten Zeile aus der wie folgt lautet:
    error C2109: Index erfordert ein Array oder einen Zeigertyp

    Wie bring ich das denn nu zum laufen? :D
    Hab im Moment irgendwie keine Ahnung mehr...
     
  2. gKar

    gKar Maunzenapfel

    Dabei seit:
    25.06.08
    Beiträge:
    5.362
    Das * steht für einen Zeiger. (Wobei ich die C-Syntax hier äußerst unlogisch und für Anfänger verwirrend finde.)
    Und natürlich gibt es einen enormen Unterschied zwischen einem Zeiger auf eine Folge von Zeichen und einem einzelnen Zeichen, wie Du es mit dem formalen Parameter "char kette" übergibst: Das ist eben keine Zeichenkette.

    Aber der Frage nach zu urteilen, solltest Du vielleicht erstmal das Zeigerkonzept wiederholen.

    (Fragen wie diese bestärken mich in der Meinung, dass es keine so gute Idee ist, Programmieranfängern ANSI-C zuzumuten. Pascal, wie wir es im Einsteigerkurs verwenden, ist da einfach viel übersichtlicher und leichter zu lernen. Und wenn man erstmal alle Konzepte verstanden hat, fällt der Umstieg auf eine andere Sprache auch nicht schwer.)
     
  3. cByte

    cByte Alkmene

    Dabei seit:
    23.02.09
    Beiträge:
    32
    Wenn du in der Main dein char_count aufrufst, nimm da mal das [100] und [2] bei der Arrayübergabe weg, also char_count(kette, zeichen). am besten machst du vor beide noch ein &. dann übergibst du nur ne referenz. sonst werden die arrays kopiert, was hier zwar nicht schlimm, aber unschön ist.

    Gruß
     
  4. Gogul

    Gogul Uelzener Rambour

    Dabei seit:
    21.05.04
    Beiträge:
    372
    in der Funktion count_char wird nur ein "char zeichen" übergeben, in deiner main rufst du es aber mit einem char array (char zeichen[2]) auf!

    Code:
    #define _CRT_SECURE_NO_DEPRECATE
    #include <stdio.h>
    int count_char(char kette, char zeichen);
    int main(void)
    {
    
        char kette[100];
        char zeichen;
        printf("Bitte Zeichenkette (max. 99) eingeben: ");
        scanf("%99s", kette);
        printf("Zu suchendes Zeichen: ");
        scanf("%c", &zeichen);
        printf("Gesuchtes Zeichen -%c- kam %d mal vor.\n", zeichen, count_char(kette[100], zeichen));
        return 0;
    }
    
    int count_char(char kette, char zeichen)
    {
        int i, z = 0;
        for(i = 0; i < 100; ++i)
            if(kette[i]==zeichen)
                z++;    
        return z;
    }
    
    
    ohne es jetzt ausprobiert zu ham!
     
  5. fufL

    fufL Friedberger Bohnapfel

    Dabei seit:
    14.05.08
    Beiträge:
    538
    Naja darüber lässt sich halt jetzt diskutieren... Bei uns an der Uni sind sie der Meinung, dass man C braucht bei der Fahrzeugentwicklung etc. und daher haben wir das 1 Semester als Vorlesung mit Praktikum und noch eine Grundlagenvorlesung... Muss man durch...

    Also das funktioniert überhaupt nicht. Da bekomm ich noch mehr Fehler ;)

    Also da bleibt der selbe Fehler bestehen... steht aber nur noch 1x da und nicht 2mal :D
     
  6. Gogul

    Gogul Uelzener Rambour

    Dabei seit:
    21.05.04
    Beiträge:
    372
    Beim der Funktion fehlt das *
    Beim einlesen mit scanf() und %c muss man auch noch mit dem eingabepuffer aufpassen, das hier geht:

    Code:
    #define _CRT_SECURE_NO_DEPRECATE
    #include <stdio.h>
    int count_char(char *kette, char zeichen); //Prototyp mit *
    int main(void)
    {
    	
        char kette[100];
        char zeichen[2];
        printf("Bitte Zeichenkette (max. 99) eingeben: ");
        scanf("%99s", kette);
        printf("Zu suchendes Zeichen: ");
        scanf("%1s", zeichen);
        //jetzt wird count_char mit zweichen[0] aufgerufen, das entspricht einem einzelnen char
        printf("Gesuchtes Zeichen -%c- kam %d mal vor.\n", zeichen[0], count_char(kette, zeichen[0]));
        return 0;
    }
    
    int count_char(char *kette, char zeichen)
    {
        int i, z = 0;
        for(i = 0; i < 100; ++i)
            if(kette[i]==zeichen)
                z++;    
        return z;
    }
    
    zwei sachen die du dir durchlesen solltest:

    pointer

    arrays

    und hier steht noch was zum eingabepuffer
     
  7. hanebambel

    hanebambel Becks Apfel (Emstaler Champagner)

    Dabei seit:
    31.08.04
    Beiträge:
    333
    Vorsicht! C kopiert keine Arrays! Wenn Du sowas hier machst:
    Code:
    char array1[100];
    char array2[100];
    
    array1 = array2;
    
    wird nur der Zeiger, der auf array1 zeigt so umgebogen, dass er auf array2 zeigt! Das entspricht dann dem hier:
    Code:
    &array1[0] = array2;
    
    bzw.

    Code:
    array1 = &array2[0];
    
    CU Jan ;)
     
  8. cByte

    cByte Alkmene

    Dabei seit:
    23.02.09
    Beiträge:
    32
    hmm, hab ich das etwa mit c++ durcheinandergeschmissen?
     
  9. awk

    awk Clairgeau

    Dabei seit:
    03.07.08
    Beiträge:
    3.687
    Wie meinst du das? Beziehst du dich auf das Post über deinem? In C++ kann ein Array auch nicht mit einem anderen initialisiert oder einem anderen zugewiesen werden (ausser man implementiert es selber).
     
  10. cByte

    cByte Alkmene

    Dabei seit:
    23.02.09
    Beiträge:
    32
    Hat sich erledigt, hab mich da vertan. Was Gogul geschrieben hat stimmt so. Sorry 4 gestiftete Verwirrung ^^
     
  11. gKar

    gKar Maunzenapfel

    Dabei seit:
    25.06.08
    Beiträge:
    5.362
    Ich bin halt der Meinung (und damit stehe ich nicht allein), dass, auch wenn C in vielen Berufsfeldern benötigt wird, es nicht gerade die beste Sprache für die ersten Schritte ist. Auch jemand, der später Rennfahrer werden will, wird deshlab nicht schon seine ersten Fahrstunden im Rennwagen absolvieren, sondern die Grundlagen in einem dafür besser geeigneten (einfacher zu beherrschenden) Fahrzeug erlernen. Das heißt ja nicht, dass er nicht später doch noch Berufsrennfahrer werden kann. Daher halte ich solche Argumente wie das obige für Humbug. Aber OK, die Entscheidung liegt ja eh nicht bei Dir, Du musst akzeptieren, was Dir vorgesetzt wird ;)
     
  12. hanebambel

    hanebambel Becks Apfel (Emstaler Champagner)

    Dabei seit:
    31.08.04
    Beiträge:
    333
    Es is wie immer im Leben: es kommt drauf an! Wenn man weiß, dass man im späteren leben nur noch OOP macht ist sicher C nicht die beste Sprache zum lernen. Spezialisiert man sich jedoch auf embeddet Systeme bzw. Mikrocontroller is man mit C sehr gut aufgestellt. Weil in der Welt läuft schlussendlich fast alles auf C hinaus bzw. der einstieg in Assembler is mit fundierten C Kenntnissen (böse Zungen behaupten ja, C sei ein generischer Assembler :) auch leichter zu bewältigen...

    CU Jan ;)
     
  13. gKar

    gKar Maunzenapfel

    Dabei seit:
    25.06.08
    Beiträge:
    5.362
    Das kann ich alles nicht nachvollziehen. OOP ist ein Paradigma, von vielen Sprachen realisiert, C ist eine Sprache. Das kann man doch nicht vergleichen.
    Auch wer OOP lernen will, sollte zunächst Grundkenntnisse in imperativer Programmierung haben. Immerhin ist auf Methodenlevel auch in der OOP alles imperativ. Grundkenntnisse einschließlich Zeigern, Datenstrukturen, Prozeduren etc. kann man also in einer imperativen Sprache lernen und später in der OOP weiter gebrauchen.
    Der Punkt war ja nur, dass, wenn man erste Schritte in imperativer Programmierung unternehmen will, C nicht die anfängergerechteste Sprache ist – und das hat nichts damit zu tun, mit ob man später weiterhin imperativ oder objektorientiert programmieren will.

    Aber OK, wir driften immer weiter vom ursprünglichen Thema ab und sollten das Thema wohl abschließen.
     

Diese Seite empfehlen