Problem mit dem Zählen der e in einem String



  • Guten Tag,

    ich habe ein Programm geschrieben welches den User auffordert einen Text einzugeben. Aus dem eingegben Text sollen nun die E's gesucht werden und diese auf dem Bildschirm ausgegeben werden.

    #include<stdio.h>
    #include<stdlib.h>
    
    main(){
           char text[1000];
           int i; 
           int zaehler;                              //Variablen Deklarieren
    
           printf("Geben sie einen Text ein: ");
           gets(text);                            // Eingabe in Text speichern
    
           if(text == 'e'){
                   for(i=1; i<=text; i++){
                            zaehler++;        
                 }
           }
    
           printf("Der Buchstabe e kam %i mal vor", zaehler);  
    
           system("PAUSE");
           return 0;
           }
    

    Aber nun kommt ne Warnung das comparision between pointer and integer und das Programm gibt jedes mal Null e raus auch wenn man 3 oder 1000 e's eingeben würde. Und das mit der Pointer Warnung kann nciht sein ich habe nämlich gar keinen gesetzt. Kann mir jemand bitte helfen???

    mfg



  • Gast34234324 schrieb:

    Und das mit der Pointer Warnung kann nciht sein ich habe nämlich gar keinen gesetzt.

    text im Kontext des Vergleiches in Z 13 ist ein Zeiger. Stattdessen solltest du dort die Länge des Strings verwenden.

    Nachtrag:
    Im Kontext des Vergleiches in Z 12 auch. Überhaupt sieht das ganze etwas chaotisch aus. Versuch mal, den Code mit Worten zu beschreiben.



  • OK

    #include<stdio.h>
    #include<stdlib.h>
    
    main(){
           char text[1000];
           int i, zaehler;                             //Variablen Deklarieren
    
           printf("Geben sie einen Text ein: ");
           gets(text);                            // Eingabe in Text speichern
    
           while(text != 'e'){
           if(text == 'e'){
                   for(i=1; i<=text; i++){
                            zaehler++;        
                            }
                   }
           }
    
           printf("Der Buchstabe e kam %i mal vor", zaehler);  
    
           system("PAUSE");
           return 0;
           }
    

    Hab den Code jetz ncoh um folgendes ergänzt. Könnte mir jemand bitte sagen was daran Falsch ist?? Ich meine mir ist jetzt keine andere Methode eingefallen als == 'e' kennt da jemand ne bessere möglichkeit ich meint strlen ließt ja den ganzen Text.



  • Gast45252435 schrieb:

    kennt da jemand ne bessere möglichkeit ich meint strlen ließt ja den ganzen Text.

    Zeichen für Zeichen durchgehen bis zum ersten Nullbyte, dort ist der String zu Ende.

    while(text != 'e')
    

    Besser:

    while(*text != 'e')
    

    In Worten: "Solange das Ziel des Zeigers kein e ist". Das wäre sinnvoll, aber nicht in deinem Sinn, weil du ja die e's zählen willst anstatt beim ersten e aufzuhören.

    Ich schlage stattdessen folgendes vor:

    while Ziel des Zeigers nicht Null:
        if Ziel des Zeigers ist ein e:
            Zaehler erhöhen
        Zeiger erhöhen
    

    Statt eines Zeigers, der erhöht wird, geht auch ein text[i] , wobei jedesmal das i erhöht werden müsste.



  • char* p = text; // = &text[0]
    while(*p) // bis '\0'
    {
      if(*p=='e')
        ++zaehler;
      ++p;
    }
    

    Etwas wie ++text; würde auch ein lvalue voraussetzen, das text nunmal nicht ist. Daher der Pointer.
    Die Alternative wäre wie mngbd geschrieben hat, der Weg über die Indizes.



  • Vicious Falcon schrieb:

    ...

    was hältst davon *p in einer char c; variablen zu speichern?



  • Bei dir ist text ein Feld (Array) von char.
    Du kannst auf jedes Element dieses Array mit einem Index zugreifen.
    Z.B.: text[0] oder text[99] oder text[i]

    Zu beachten ist, das jedes Array mit 0 beginnt.
    Du mußt also jedes Element des Feldes mit 'e' verglichen:

    if (text[i] == 'e') zaehler++;
    

    i muß dann nur noch von 0 bis strlen(text) durchlaufen.

    Welche Programmiersprache kennst du bis jetzt?
    In jedem C-Buch, ob gedruckt oder online gibt es Kapitel über Arrays, Zeiger und Strings.



  • Jeder normale Programmierer schreibt so was:

    char* p;
    int zaehler=0;
    for (p=text;*p;zaehler+=(*p=='e'),++p);
    

    Für ein Anfänger ist das besser:

    int zaehler=0;
    int index;
    for (index=0; text[index]!='\0'; ++index) {
      if(text[index] == 'e') {
        zaehler++;
      }
    }
    

Anmelden zum Antworten