Funktion die Buchstaben zählt und mit Pointer die Postion ausgibt



  • Ein Freund bauchte hilfe bei einer Aufgabe die er machen sollte. Ich dachte ich helfe ihn(Programmiere Normalerweise in Java/Python), dann kann ich drauf entweder kenne ich mich zuwenig mit pointer aus oder es fehlt wichtige Information in der Angabe. Ich weiß das Pointer die Addresse einer Variable verweißen können und den Wert der Postion anzeigen können.

    Die Aufgabenstellung

    Wir haben beim Programm schon fast fertig, aber stehen jetzt an wengen der schlecht formulierten Angabe und Pointern.
    Ich habe überhaupt keinen Plan, was mit der Variable n aufsich hat. (Ob ein Wert einglesen werden soll oder ein fixer Wert festgelegt werden soll.) Vielleicht habt ihr eine Ahnung.

    Es sollte so aussehen: Durchlauf1; Durchlauf2

    Ich hoffe einer kann uns helfen. Freue mich schon auf eure Antworten und Ideen.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    
    char *letter_n(char *str, char letter, int n);
    
    int main() {
    	char answer = 'y';
    	char *str = "This is a test string to verify functionality";
    	char letter;
    	int n = 30;
    	int u = 1;
    	char o;
    
    	while (answer != 'n') {
    
    		printf("\nTeststring: %s \n", str);
    		printf("\nNach welchem Buchstaben wollen Sie suchen? ");
    		fflush(stdout);
    		scanf("%c", &letter);
    		fflush(stdin);
    
    		o = letter_n(str, letter, n);
    		printf("\n%d.Buchstabe '%c' Indexposition %d: %c", u++, letter, o, letter);
    		fflush(stdout);
    
    		printf("\nNoch ein Prorammdurchlauf (j/n) ? ");
    		fflush(stdout);
    		scanf("%c", &answer);
    		fflush(stdin);
    	}
    	return 0;
    }
    
    char *letter_n(char *str, char letter, int n) {
    	int k = strlen(str);
    	char *o = NULL;
    
    	for (int i = 0; i < k; i++) {
    
    		if (tolower(*(str + i)) == letter)
            {
    			o = (char)i;
    			return o;
    		}
    	}
    }
    


  • @Mat_ftt sagte in Funktion die Buchstaben zählt und mit Pointer die Postion ausgibt:

    wengen der schlecht formulierten Angabe

    Die Aufgabenstellung ist Glasklar. Ihr könnt nur beide kein C. Das Einlesen vom Buchstaben und die Frage ob das nocheinmal gesucht werden soll dichtet ihr sogar unnötigerweise dazu1), aber sei's drum.

    /*
    Erstellen Sie eine Funktion char *letter_n(char *str, char letter, int n). Die Funktion soll als formale
    Parameter eine Zeichekette *str (äquivalent zu str[]), den gesuchten Buchstaben letter sowie die
    Zahl n besitzen. Die Zahl n gibt dabei an, das man das n-te Vorkommen des Buchstabens letter sucht.
    Als Rückgabewert liefert die Funktion einen Zeiger auf die Position in der Zeichenkette, an der der
    Buchstabe letter das n-te mal vorkommt. Das heißt, durch dereferenzieren dieses Pointers kann ich
    durch Ausgabe mittels printf oder putchar gleich unmittelbar überprüfen, ob sich an dieser Position
    auch tatsächlich der Buchstabe letter befindet.
    Kommt der Buchstabe letter in der Zeichenkette gar nicht vor oder nicht so oft vor wie mit dem
    Parameter n angegeben soll die Funktion NULL retournieren. Als Test erstellen Sie in der Funktion
    main eine Schleife mit einem Fähler der bei 1 beginnt mit damit die Funktion letter_n mit einem langen
    Teststring aufruft. Wenn der Rückgabewert ungleich NULL war dann verwenden Sie den Rückgabewert
    um sowohl die Position in der Zeichenkette auszugeben (Wie können Sie mit Hilfe von 2 Pointer den
    Offset errechnen?), als auch den Buchstaben an dieser Position auszugeben (Verifikationsschritt).
    Danach erhöhen Sie den Zähler um Eins und rufen die Funktion erneut auf. Das Ganze machen Sie so
    lange bis der Rückgabewert der Funktion NULL ist. was gleichbedeutend damit ist, daß der Buchstabe
    letter kein weiteres mal vorkommt.
    Wenn der gesuchte Buchstabe kein einziges Mal vorkommt geben Sie das gesondert aus.
    */
    
    #include <stdlib.h>
    #include <stdio.h>
    #include <ctype.h>
    
    char const* letter_n(char const *str, char letter, size_t n)
    {
        letter = tolower(letter);
    
        for (size_t occurrence_counter = 0; *str; ++str) {
            if (tolower(*str) == letter) {
                if (++occurrence_counter == n)
                    return str;
            }
        }
    
        return NULL;
    }
    
    enum { MAX_LENGTH = 80 };
    
    int main()
    {
        // der Aufgabenstellung nach ist folgendes Einlesen der Werte fuer text und letter foellig unnoetig.
        // Direkte Definition im Sourcecode wuerde reichen.
    
        printf("Teststring: ");
        char text[MAX_LENGTH + 1];
        if (!fgets(text, sizeof(text), stdin)) {
            fputs("Input error :(\n\n", stderr);
            return EXIT_FAILURE;
        }
            
        printf("Nach welchem Buchstaben wollen Sie suchen? ");
        char letter;
        if (scanf(" %c", &letter) != 1) {
            fputs("Input error :(\n\n", stderr);
            return EXIT_FAILURE;
        }
    
        // Aufgabe:
    
        size_t occurrence = 1;  // der Aufgabenstellung geschuldet, 0 waere mir lieber gewesen
        for (char const *result; result = letter_n(text, letter, occurrence); ++occurrence) {
            printf("%zu. Buchstabe '%c' an Indexposition %td: %c\n",
                occurrence, letter, result - text, *result);
        }
    
        if (occurrence == 1)  // der Aufgabenstellung geschuldet, 0 waere mir lieber gewesen
            printf("Buchstabe '%c' nicht gefunden.\n", letter);
    }
    

    1) Davon daß auf die Unterscheidung von Groß- und Kleinbuchstaben verzichtet werden soll steht da auch nirgends etwas.



  • @Mat_ftt sagte in Funktion die Buchstaben zählt und mit Pointer die Postion ausgibt:

    fflush(stdin);
    

    Wer hat denn den Blödsinn beigebracht?? fflush() ist für Inputstreams undefiniert.



  • @Mat_ftt Ganz, ganz wichtig: char und char* sind Grundlegend verschiedene Datentypen.

    Die kann man nicht „einfach so“ gegeneinander zuweisen.
    Und wenn da der Compiler meckert, hat er Recht.
    Ein Cast macht das dann auch nicht richtig, nur bleibt der Compiler still.



  • @Mat_ftt sagte in Funktion die Buchstaben zählt und mit Pointer die Postion ausgibt:

    Ich habe überhaupt keinen Plan, was mit der Variable n aufsich hat. (Ob ein Wert einglesen werden soll oder ein fixer Wert festgelegt werden soll.) Vielleicht habt ihr eine Ahnung.

    Um darauf noch dezidiert zu antworten:
    Der Parameter n gibt an das wievielte Vorkommen von letter gesucht werden soll. Der Aufgabenstellung nach sollst Du alle Vorkommen nacheinander finden, deswegen auch die Schleife in main() in der eine Variable bei 1 beginnend bei jedem Schleifendurchlauf um 1 erhöht wird.



  • @Swordfish Danke für deine Hilfe. Trotz meinen fehlenden verständnis für pointer.



  • @Swordfish sagte in Funktion die Buchstaben zählt und mit Pointer die Postion ausgibt:

    1. Davon daß auf die Unterscheidung von Groß- und Kleinbuchstaben verzichtet werden soll steht da auch nirgends etwas.

    Leider.
    Man sieht es nur in der Ausgabe von Durchlauf2 beim 'T'



  • @Swordfish Danke für die klarstellung.



  • @DirkB sagte in Funktion die Buchstaben zählt und mit Pointer die Postion ausgibt:

    Man sieht es nur in der Ausgabe von Durchlauf2 beim 'T'

    Und irgendwie bezweifle ich daß das Teil der Aufgabenstellung ist. Aber das kann nur @Mat_ftt beantworten.