Zählen, wie oft eine Zeichenfolge in einer anderen

Habe ich schon für mehr als 3 Stunden versucht dieses problem zu lösen, aber es funktioniert nicht 100%. Bitte helfen Sie mir.

Problem:
Erstellen Sie eine Funktion, erhält zwei Saiten (A und B) und zeigen Sie die Anzahl der Male das Wort der string-B erscheint in der Einen, ohne mit einer Funktion, die gehören in die Bibliothek.
Zum Beispiel:

  • String Ein: house houuse househousehous
  • String B: house

Es braucht, um zu zeigen, dass das Wort Haus erscheint 3x im string A.

#include <stdio.h>
#include <stdlib.h> 
#include <conio.h> 
#include <string.h>

void count_string_b_a(char *a, char *b){
   int i,j,k=0,size_a,size_b,equal=0,cont=0;
   size_a = strlen(a); 
   size_b = strlen(b);
   j=0;
   for(i = 0; i < size_b; i++){ 
     for(j = 0; j < size_a; j++){ 
        k=0;
        equal=0;
        for(k=0; k<size_b; k++){
           if(a[j+k] == b[i+k]) equal++;
           if(equal==size_b) cont++;
        } 
      } 
   }    
   printf("B %s appears %d times in A %s",b,cont,a);
}

int main(){
   int i;
   char a[40], b[10];
   scanf("%[^\n]s",&a); getchar();
   scanf("%[^\n]s",&b);
   count_string_b_a(a,b);
   getch();
 }
  • Warum nicht Schritt für Schritt durch den code in Ihrem debugger, bis Sie sehen das problem ?
  • "ohne Funktion gehören die Bibliothek" Was könnte die motivation für die Vermeidung von library-Funktionen, die explizit konzipiert für die Arbeit mit strings? Wenn das Ziel ist, zu verstehen, wie diese Funktionen arbeiten, können Sie untersuchen den Quellcode von populären Implementierungen, aber es ist wohl wichtiger in der Lage sein, Sie zu nutzen als in der Lage sein, Sie zu schreiben.
  • Nicht strlen() eine Funktion in der standard library? Ich muss davon ausgehen, dürfen Sie den I/O-Funktionen...Aber vielleicht ist die Forderung nicht, die Verwendung der string-Suche-Funktionen. Die Zuordnung k=0 vor der for (k = 0; ...) - Schleife ist überflüssig.
  • Ein Grund für die nicht-Verwendung des Debuggers ist, dass der Algorithmus falsch ist. Das ist besser gelöst, indem das denken als Debuggen. Sie haben zwei Zeichenfolgen, Nadel und Heuhaufen. Für jede position im Heuhaufen, die Sie brauchen, um zu überprüfen, ob die Nadel passt, die an der aktuellen position. Dafür müssen Sie zwei geschachtelte Schleifen, nicht drei.
  • Ich denke, dass strstr verwenden können werden leicht als selbst implementieren, strstr ist die standard-Funktion der C-Sprache.
  • Sie brauchen, um count des matches. Das ist eine Schleife. Sie müssen auch das nächste match. Das ist eine andere Schleife. Richtig?
  • Das ist nicht der Weg würde ich es anschauen. Siehe meine Antwort...und siehe mein Kommentar, der feststellt, dass für jede position im Heuhaufen (eine Schleife), die Sie benötigen, um zu sehen, ob die Zeichenfolge beginnend an der aktuellen position entspricht, die Nadel (das ist die zweite, innere, geschachtelte Schleife). Der Algorithmus beschrieben und codiert ist naiv, es gibt bessere algorithmen verfügbar (Boyer-Moore, Knuth-Morris-Pratt, zum Beispiel: siehe Exakte String-Matching-Algorithmen für Beispiele). Für die Beispiele, ist es wahrscheinlich egal; für die Bioinformatik DNA, es wäre die Sache eine Menge.

InformationsquelleAutor Roni Castro | 2013-07-31
Schreibe einen Kommentar