nach dem n-ten auftreten eines zeichens im String suchen



  • Hallo,

    ich steh gerade etwas auf dem Schlauch;

    Ich habe einen String mit einer bestimmten Länge. Nun steht in diesem String mehrmals die gleichen bestimmten Zeichen drin, z.B. 1 oder 2.

    Jetzt möchte ich sagen, dass er (z.B.) die dritte 1 in diesem String suchen soll und diese + 5 weitere Zeichen, die an der 1 hängen, ausgeben soll.

    Wisst ihr soweit, was ich meine? Ich habe nämlich keine richtige Idee, wie ich da rangehen soll

    Gruß Hans



  • Wie du es mit den Fingern auf einem Blatt Papier auch machen würdest.

    Den String Zeichen für Zeichen durchgehen und mitzählen.
    Dabei auf das Stringende achten.

    Wenn richtige Anzahl gefunden, dann kopieren.

    Fertig.

    Du könntest für den ersten Teil strchr nehmen, das macht es aber auch nicht einfacher.


  • Mod

    Nun, du suchst nach '1'en; zählst mit, wie viele du gefunden hast; und dann, wenn du drei gefunden hast, gibst du bis zu 5 darauf folgende Zeichen aus.

    Ja, das ist nur eine Wiedergabe deines Vorhabens. Aber jeder einzelne Schritt ist doch einfach. Womit hast du Schwierigkeiten?



  • Implementier erstmal das Problem: finde das nte Auftreten von Buchstabe c in einem String.

    In der C-Library gibt es eine Funktion, die schon was ähnliches macht. dort würde ich mir das Interface borgen:

    char* strchr(const char* s, int c); // gibt einen Zeiger auf das erste Vorkommen von c(nach char konvertiert) in s zurück
    

    Deine Funktion nimmt jetzt noch einen weiteren int Parameter, zb.

    char* find_nth(const char* s, int c, int n) // gibt einen Zeiger auf das nte c in s zurück oder NULL
    

    Das hilft Dir doch sicherlich schon auf die Sprünge.



  • Danke schonmal fuer die Hilfe.

    Nun, du suchst nach '1'en; zählst mit, wie viele du gefunden hast; und dann, wenn du drei gefunden hast, gibst du bis zu 5 darauf folgende Zeichen aus

    nicht ganz; ich suche alle '1'en und möchte dann von z.B. der dritten '1' die nächten 5 Zeichen. Nicht von allen.

    Implementier erstmal das Problem: finde das nte Auftreten von Buchstabe c in einem String.

    In der C-Library gibt es eine Funktion, die schon was ähnliches macht. dort würde ich mir das Interface borgen:
    C:
    char* strchr(const char* s, int c); // gibt einen Zeiger auf das erste Vorkommen von c(nach char konvertiert) in s zurück

    Deine Funktion nimmt jetzt noch einen weiteren int Parameter, zb.
    C:
    char* find_nth(const char* s, int c, int n) // gibt einen Zeiger auf das nte c in s zurück oder NULL

    Das hilft Dir doch sicherlich schon auf die Sprünge.

    ok, das erste ist mir soweit klar. Hatte ich auch schonmal gefunden. Klappt auch soweit.
    Nur mit dem zweiten komme ich mit der Anwendung, wie ich es implementiere, nicht so richtig zu recht.

    Stecke, was Arrays und Pointer angeht, noch ziemlich in den Kinderschuhen 🙂


  • Mod

    hans1778 schrieb:

    Danke schonmal fuer die Hilfe.

    Nun, du suchst nach '1'en; zählst mit, wie viele du gefunden hast; und dann, wenn du drei gefunden hast, gibst du bis zu 5 darauf folgende Zeichen aus

    nicht ganz; ich suche alle '1'en und möchte dann von z.B. der dritten '1' die nächten 5 Zeichen. Nicht von allen.

    😕 Genau das beschreibe ich doch:

    Nun, du suchst nach '1'en; zählst mit, wie viele du gefunden hast; und dann, wenn du drei gefunden hast, gibst du bis zu 5 darauf folgende Zeichen aus

    Stecke, was Arrays und Pointer angeht, noch ziemlich in den Kinderschuhen 🙂

    Das ist ziemlich schlecht, wenn man in C mit Zeichenketten arbeiten will, denn in C werden Zeichenketten mittels Arrays und Pointern dargestellt. Schnapp dir ein gutes Buch und lerne über das Thema!



  • hans1778 schrieb:

    Stecke, was Arrays und Pointer angeht, noch ziemlich in den Kinderschuhen 🙂

    Deswegen sollst du auf strchr auch verzichten und es selber machen.

    Hast du schon mal strlen und strcpy nachprogrammiert?



  • 😕 Genau das beschreibe ich doch:

    Ok, hab ich bloß falsch verstanden.

    Deswegen sollst du auf strchr auch verzichten und es selber machen.

    dann werde ich das mal probieren. Hast du einen Tipp fuer die Herangehensweise?

    Hast du schon mal strlen und strcpy nachprogrammiert?

    Nein, bis jetzt nicht.


  • Mod

    hans1778 schrieb:

    Hast du schon mal strlen und strcpy nachprogrammiert?

    Nein, bis jetzt nicht.

    Dann mach das erst einmal. Dabei lernst du nämlich, was es wirklich bedeutet, wenn man von nullterminierten Zeichenketten redet und wie das Grundgerüst einer Funktion aussieht, die damit arbeitet. Dein Problem mit dem n-ten Auftreten eines Zeichens ist dann bloß eine leicht verkomplizierte Version des üblichen Grundaufbaus.



  • ok, ich versuch mich gerade in das ganze thema rein zu arbeiten. Ein Pointer zeigt ja auf eine Speicheradresse!? Kann ich den Inhalt dieser Adresse auf eine Variable schreiben? Bzw wie?!

    Ich kann ja z.B. sowas schreiben;

    if (*ptr == '1'){....}
    

    Will aber statt der '1' eine ständig wechselnde Variable.

    Und wenn ich dann schreibe

    x = *ptr;
    

    schreibt er ja auf x die Adresse und nciht den Wert.

    Steh ich da einfach auf dem Schlauch?

    Gruß Hans



  • Ja, du stehst auf dem Schlauch.
    bei

    char x;
    char *ptr;
    

    ist sowohl x als auch *ptr (mit dem 😉 ein char.
    ptr ist der Zeiger auf char.

    So wie es bei der Definition steht, ist es die "Variable" und nicht der

    Also ist x = *ptr völlig richtig. Der Wert von der Adresse auf die ptr zeigt, wird x zugewiesen.
    Bei x = ptr meckert auch der Compiler mit einer Warnung.

    Umgekehrt geht es auch.
    *ptr = x; An die Adresse auf die ptr zeigt, wird der Wert von x kopiert.
    Jetzt mit Adressen:
    ptr = &x; Der Zeiger ptr erhält jetzt die Adresse von x;

    Zeiger.

    Auch bei einem Doppelzeiger char **arg; ist **arg ein char.
    *arg ist ein 'Zeiger auf char' und arg ist ein 'Zeiger auf einen Zeiger auf char'.


Anmelden zum Antworten