String durchsuchen

mcyonx

Grünschnabel
Hallo!

Ich muss in einem Programm einen String durchsuchen und ausgeben, wieoft eine Zahl in dem String vorkommt. Ich kenne die Funktionen str(r)chr, aber die geben mir die Stelle, an der die Zahl steht aus. Gibt es irgendeine einfache Möglichkeit die Anzahl der Zahlen herauszufinden (vielleicht mit Hilfe einer Schleife)?

Würde mich über jede Hilfe freuen.

Gruß mcyonx
 
Hallo,

folgendes könnte klappen (ungetestet):
Code:
char *str = "foobar";
char *substr = str;
int needle = 'o';
int count = 0;
while (substr = strchr(substr, needle)) {
    count++;
    substr++;
}

Grüße,
Matthias
 
Ich würde zuerste eine kopie des Original strings machen. In der Kopie dann immer wenn die zahl gefunden wurde einen zähler hochsetzen, und danach in der kopie das gesuchte zeichen löschen, z.B so(ebenfalls ungetestet) :
C++:
int durchsuchen (char *inputstring, char suchzahl){
    char helpstring[]  = {inputstring}; //bin mir nicht ganz sicher ob das geht, ansonsten machs mit strcpy()
    char *zeiger = NULL;
    int i = 0;

    while(zeiger = strchr(helpstring, suchzahl)){
        i++;
        *zeiger = 'h'; //oder irgendwas anderes unwichtiges
    }
    return i;
}
 
Zuletzt bearbeitet:
Ich würde zuerste eine kopie des Original strings machen. In der Kopie dann immer wenn die zahl gefunden wurde einen zähler hochsetzen, und danach in der kopie das gesuchte zeichen löschen, z.B so(ebenfalls ungetestet) :
[…]
Man sollte dabei aber bedenken, dass man dadurch im schlimmsten Fall eine quadratische Laufzeit erhält. Abgesehen davon, dass das Anlegen der Kopie auch so seine Zeit (und zusätzlichen Speicher!) braucht.

Grüße,
Matthias
 
Man sollte dabei aber bedenken, dass man dadurch im schlimmsten Fall eine quadratische Laufzeit erhält. Abgesehen davon, dass das Anlegen der Kopie auch so seine Zeit (und zusätzlichen Speicher!) braucht.

Grüße,
Matthias

Das ist natürlich richtig, aber je nach Anwendung is das bischen Zeit, das verloen geht nicht so wild, das mit der quadratischen Laufzeit halte ich für etwas übertrieben.
Aber ich weiß es nicht genau da ich mich noch nicht so lange mit c++ beschäftige.
Ich hätte übrigens eine Frage:
Wenn du den substring um ++ erhöst bedeutet das doch, dass du sozusagen die erste Stelle abgeschnitten hast, oder? Aber damit wäre doch noch nicht gewährleistet, dass die gefundene Zahl, nicht nochmal gezählt werden kann, oder?:confused:
Ich möchte jetzt wirklich nicht dein beispiel schöecht machen, würde es aber gerne verstehen.

gruß Ryu1991
 
Das ist natürlich richtig, aber je nach Anwendung is das bischen Zeit, das verloen geht nicht so wild, das mit der quadratischen Laufzeit halte ich für etwas übertrieben.
Das ist nicht übertrieben. Wenn man einen String der Länge n betrachtet, der n mal das gesuchte Zeichen enthält, bekommt man quadratische Laufzeit.

Ich hätte übrigens eine Frage:
Wenn du den substring um ++ erhöst bedeutet das doch, dass du sozusagen die erste Stelle abgeschnitten hast, oder? Aber damit wäre doch noch nicht gewährleistet, dass die gefundene Zahl, nicht nochmal gezählt werden kann, oder?:confused:
Natürlich ist das gewährleistet. Wie du ja schon richtig erkannt hast, wird durch das Inkrementieren des Zeigers das erste Zeichen nicht mehr betrachtet. Das erste Zeichen ist aber genau das gefundene Zeichen. Also wird es beim nächsten Aufruf von strchr nicht mehr angeschaut.

Grüße,
Matthias
 
Irgendwie funktionieren beide Vorschläge bei mir nicht so richtig. Beim ersten gibt er mir immer 2293508 aus und bei dem anderen Vorschlag nur 0 oder 1.
Hat einer eine Idee woran es liegen könnte? Versuche die ganze Zeit das irgendwie in den Griff bekommen, aber irgendwie will es nicht so recht.

Danke im Voraus.

Gruß mcyonx
 
Hi.
Irgendwie funktionieren beide Vorschläge bei mir nicht so richtig. Beim ersten gibt er mir immer 2293508 aus und bei dem anderen Vorschlag nur 0 oder 1.
Hat einer eine Idee woran es liegen könnte? Versuche die ganze Zeit das irgendwie in den Griff bekommen, aber irgendwie will es nicht so recht.
Du hast wahrscheinlich einen Fehler bei der Ausgabe gemacht. Zeig deinen Code, wir sind keine Hellseher...

Gruß
 
Hier mein Quelltext:

Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int durchsuchen (char *text, int suche){
char helpstring[1000];
strcpy(text, helpstring);
char *zeiger = NULL;
int i = 0;
    while(zeiger = strchr(helpstring, suche)){
             i++;
    *zeiger = 'h';
        }
   return  i;
       } 
   
int main (void)
{
FILE *Datei;
char *loc,text[1000];
int ch,z1,z2,laenge,such;
int count = 0;
Datei = fopen ("C:\\test1.txt", "r");

 fscanf (Datei, "%s", &text);
 printf ("%s", &text);
 printf("\n");
 
 printf("\nGeben Sie das zu suchende Zeichen ein: ");
 ch = getchar();
 
  printf("Durchsuchen: %i\n", durchsuchen(text, ch));
 system("pause");
 fclose(Datei);
 return 0;
}

In test1.txt steht die Zahlenfolge.

Gruß mcyonx
 
Zurück