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 Zuordnungk=0
vor derfor (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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, das ist mein Ansatz zu diesem problem, zu berechnen, wie viele Male ein Wort erscheint in einem bestimmten string. Eine benutzerdefinierte mystrlen () - Funktion imitiert die strlen-Funktion von C. Die einzige header-Datei, die Sie brauchen, ist stdio.h
pencil
code istppencil
. Der code zählt nicht richtig. Es ist auch überraschend, zu sehen, nur eine explizite Schleife — das erschwert die Analyse.pencil
imppencil
oderpepencil
oderpenpencil
oderpencpencil
oderpencipencil
fehlschlägt). Mitmystrlen()
imfor
loop-Kontrolle ist nicht eine gute Idee. Es bedeutet, dass die äußere Schleife ist quadratisch in die Länge von Heuhaufen. Diemystrlen()
innerhalb der Schleife ist weniger problematisch, aber wenn Sie die Längen, sollte man vorberechnen Sie außerhalb der Schleife. (int haylen = strlen(haystack); int pinlen = strlen(needle);
oder so). Oder Sie können den code ändern, um zu überprüfen, für das null-byte am Ende der Heuhaufen und die Nadel.Dieses ist meine einfältige Lösung des Problems, mit zwei Schleifen, wie ich schon in einem Kommentar angedeutet:
Beachten Sie, wie die Berechnung der Anzahl der vorkommen erfolgt getrennt von der Druckerei die Anzahl der vorkommen. Die Funktion meldet die Anzahl der vorkommen könnte, werden in der Regel sinnvoll, eine Funktion, die auch druckt die Daten wahrscheinlich nicht wiederverwendbar sein. Im Allgemeinen, die Trennung der I/O von Berechnung ist eine gute Idee.
Beispiel-Ausgabe:
Bessere algorithmen existieren
Den Algorithmus codiert oben ist naiv, es gibt viele bessere string-matching-algorithmen zur Verfügung (Boyer-Moore, Knuth-Morris-Pratt, zum Beispiel: siehe Exakte String-Matching-Algorithmen für Beispiele). Es macht aber Arbeit und ist einfach zu verstehen. Zum Beispiel Streicher, ist es wahrscheinlich egal; für Bioinformatik und DNA-fragment zusammenbringen würde, so würde es eine Menge.
braucht meiner Meinung nach:
zurücksetzen, um Ihren Zähler zu finden, eine nächste match.
Sollten Sie wahrscheinlich Lesen Sie die scanf-Handbuch, sorgfältig. In der Tat, dies gilt für alle standard-library-Funktionen.
%[^\n]s
ist nicht ein Derivat der%s
format specifier; Es ist ein%[^\n]
gefolgt von einem Versuch gelesen (und entsorgen) eine wörtliche's'
Charakter. Ich schlage vor, es zu beheben, durch das entfernen ders
von der Ende, und Lesen Sie die Bedienungsanleitung, bevor Sie irgendwelche C-standard-library-Funktion zum ersten mal. Vergessen Sie nicht, überprüfen Sie den Rückgabewert.In was für einer Welt Sie verwenden dürfen
strlen
, aber nichtstrncmp
? Loswerden:Verwenden
strncmp(&a[i], b)
zu bestimmen, Gleichstellung, statt. Wenn Sie keine standard-Bibliothek Funktionen, die in dieser übung, dann schreiben Sie Ihre eigenen standard-konformstrlen
undstrncmp
- und inline-Sie manuell in Ihre Funktion. Sie könnten dann erkennen, dass Ihre beiden inneren Schleifen nicht tun, was Sie sollen. Ich würde vorschlagen, dass diese übung, die Sie tun, ist eine Verschwendung von Zeit, weil es lehrt Sie, Dinge zu tun, der falsche Weg. Wenn Sie müssen neu erfindenstrncmp
undstrlen
, dann tun Sie so, durch das schreiben der eigenenstrncmp
undstrlen
.verwenden
strstr
wie diese